利用栈实现的简单中缀表达式求值(C语言)
这只是个小作业,要求实现简单中缀表达式求值
所谓前缀、中缀、后缀,是指运算符相对于运算数的位置而言,看如下例子:
(1 + 2) × 3 - 4 就是中缀表达式
- × + 1 2 3 4 就是前缀表达式
1 2 + 3 × 4 - 就是后缀表达式
所以其实只有加、减、乘、除以及括号的四则运算,大致思路是定义了两个栈:操作符栈和操作数栈,顾名思义,操作符用于存放运算符,操作数用于存放运算数字。代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
/**
* 操作栈的相关定义
*/
typedef struct
{
char *elem;
int top;
int size;
}Sqstack;
//定义操作符栈和操作数栈
Sqstack Ope;
Sqstack Num;
void Initstack(Sqstack *s) //初始化栈
{
s->size=50;
s->top=0;
s->elem=(char*)malloc(s->size*sizeof(char));
if(!s->elem)
printf("OVERFLOW");
}
void Push(Sqstack *s,char e) //入栈
{
if(s->top>=s->size)//栈内存不够时
{
char *newelem;
int increment=50;
newelem=(char*)realloc(s->elem,(s->size+increment)*sizeof(char));
s->elem=newelem;
s->size=s->size+increment;
}
s->elem[s->top]=e;
s->top++;
}
void Pop(Sqstack *s)//出栈
{
s->top--;
}
char GetTop(Sqstack *s)//取栈顶元素
{
char e;
s->top--;
e=s->elem[s->top];
return e;
}
void calculate(Sqstack *ope,Sqstack *num)
{
char num1,num2,op;
num2=GetTop(num);
num1=GetTop(num);
op=GetTop(ope);
int tmpResult=0;
switch(op)
{
case '+':
tmpResult=num1+num2;
break;
case '-':
tmpResult=num1-num2;
break;
case '*':
tmpResult=num1*num2;
break;
case '/':
tmpResult=num1/num2;
break;
}
Push(num,tmpResult);//入栈
}
void dealExpression()
{
Initstack(&Ope);
Initstack(&Num);
printf("请输入正确的中缀表达式(以#号结束):");
char onechar; //单个字符
scanf("%c",&onechar);
while(onechar!='#')
{
switch(onechar)
{
case '+':
case '-':
if(Ope.top&&Ope.elem[Ope.top-1]!='(')
{
calculate(&Ope,&Num);
}
Push(&Ope,onechar); //入栈
scanf("%c",&onechar);
break;
case '*':
case '/':
if(Ope.top&&(Ope.elem[Ope.top-1]=='*'||Ope.elem[Ope.top-1]=='/'))
{
calculate(&Ope,&Num);
}
Push(&Ope,onechar); //入栈
scanf("%c",&onechar);
break;
case '(':
Push(&Ope,onechar); //入栈
scanf("%c",&onechar);
break;
case ')':
while(Ope.elem[Ope.top-1]!='(')//当前是')',则Ope栈一定能有'('匹配到,即Ope栈一定不为空
{
calculate(&Ope,&Num);
}
Pop(&Ope);//出栈,弹出左括号
scanf("%c",&onechar);
break;
default://onechar为数字,则入num栈
char opNum=0;
do{
opNum=opNum*10+onechar-'0';
scanf("%c", &onechar);
}while(onechar>='0' && onechar<='9');
Push(&Num,opNum);
break;
}//end switch
}//end while
while(Ope.top)
{
calculate(&Ope,&Num);
}
int result;
result=Num.elem[Num.top-1];
printf("计算结果是%d\n", result);
}
int main()
{
dealExpression();
return 0;
}