📄 intcalculate.cpp
字号:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define IS 100 //定义栈的初始分配量
#define C 10 //定义栈的分配增量
typedef struct{
int *base; //栈底指针
int *top; //栈顶指针
int stacksize; //当前已分配的存储空间
}sqstack;
//===========================================================================
void Initstack(sqstack *s){
//构造一个空栈S
s->base=(int *)malloc(IS*sizeof(int));
if(!s->base)exit(-1); //若栈初始化存储分配失败,退出程序
s->top=s->base;
s->stacksize=IS;
}
//============================================================================
int Gettop(sqstack *s){
//若栈不空,则返回S的栈顶元素的值
if(s->top==s->base) return 0;
return(*(s->top-1));
}
//============================================================================
void push(sqstack *s,int e){
//插入元素e为新的栈顶元素
if(s->top-s->base>=s->stacksize){ //栈满,追加存储空间
s->base=(int *)realloc(s->base,(s->stacksize+C)*sizeof(int));
if(!s->base)exit(-1); //若追加存储空间失败,退出程序
s->top=s->base+s->stacksize; //修改栈顶指针
s->stacksize+=C; //修改当前已分配存储空间
}
*s->top++=e;
}
//============================================================================
int pop(sqstack *s){
//若栈不空,则删除S的栈顶元素,并返回其值
if(s->top==s->base){
printf("栈为空,删除栈顶元素失败!\n");
exit(1); //若栈为空,告知使用者并退出程序
}//if
return(*--s->top);
}
//=============================================================================
int In(char c){
//此函数起到判断a是否为运算符的作用
//如果a为数字,则返回0,代表其不是运算符
if(c=='+') return 1;
if(c=='-') return 1;
if(c=='*') return 1;
if(c=='/') return 1;
if(c=='(') return 1;
if(c==')') return 1;
if(c=='#') return 1;
return 0;
}
//==============================================================================
int Operate(int a,char theta,int b){
//计算表达式a theta b(theta代表运算符),并返回其值
if(theta=='+')return(a+b);
if(theta=='-')return(a-b);
if(theta=='/'){
if(b==0){
printf("除数为0,输入错误!\n"); //当除数为0时,告知使用者并退出程序
exit(-1);
}
else return(a/b);
}
if(theta=='*')return(a*b);
else return 0; //当两数字之间的运算符输入错误(不是+,-,*,/),退出程序
}
char Precede(char g,char c){
//判断运算符a和b的优先级
switch(g){
case'(':if(c==')')return'=';
else return('<');
case'#':return('<');
case')':return('>');
case'+':
case'-':if(c=='*'||c=='/'||c=='(')
return ('<');
else return('>');
case'*':
case'/':
if(c=='(')return('<');
else return('>');
default:{
printf("输入错误!");
exit(-1);
}
}
}
//=================================================================================
void Destroy(sqstack *S){
//销毁栈
free(S->base);
}//Destroy
sqstack OPTR,OPND; //定义全局运算符栈OPTR和操作数栈OPND
//=================================================================================
void main(){
char c,theta;
int a,b,temp=0;
Initstack(&OPTR); //初始化运算符栈
push(&OPTR,'#'); //令表达式起始符'#'入栈
Initstack(&OPND); //初始化操作数栈
printf("本程序为简单算术表达式求值程序,欢迎使用!\n");
printf("******************************************************************************\n");
printf("请输入正确的整数表达式,结束请输入‘#’:\n");
c=getchar();
while((c!='\n')&&(c!='#'||Gettop(&OPTR)!='#')){
if(!In(c)){
while(In(c)==0){
temp=temp*10+c-'0';
c=getchar();
}//while
push(&OPND,temp);
temp=0;
}//if //不是运算符进操作数栈
else
switch(Precede(Gettop(&OPTR),c)){
case'<': //栈顶元素优先级低
push(&OPTR,c);c=getchar();
break;
case'=': //脱括号并接收下一字符
pop(&OPTR);c=getchar();
break;
case'>': //退栈并将运算结果入栈
theta=pop(&OPTR);
(int) a=pop(&OPND);(int) b=pop(&OPND);
push(&OPND,Operate(b,theta,a));
break;
}
}
printf("结果是:%-5d\n",Gettop(&OPND));
Destroy(&OPTR);
Destroy(&OPND);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -