/*思路: 边解析边用两个栈来做
s1: 用来放操作数
s2:用来放运算符
s1:来一个操作数,入一个栈
s2:
入栈条件:栈为空的时候直接入栈
栈不为空的情况下:
如果来的这个运算符(也就是即将入栈的运算符)
优先级 高于
栈顶运算符
动作:入栈
while()
如果来的这个运算符(也就是即将入栈的运算符)
优先级 低于 <=
栈顶运算符
动作:干掉栈顶元素(s2栈顶出栈op,同时要从s1出栈两个数据a b,
计算 c = a op b,最后,再把计算结果c入栈s1)
这里需要注意ab哪一个是第一个操作数
最终动作:入栈
全部入栈后:s1 和 s2 同时出栈并且计算,直到s2为空 (s2栈顶出栈op,
同时要从s1出栈两个数据a b,
计算 c = a op b,最后,再把计算结果c入栈s1)
最后结果:S1的栈顶元素*/
#include "SeqStack.h"
int main()
{
SeqStack *S1 = (SeqStack*)malloc(sizeof(SeqStack));
SeqStack *S2 = (SeqStack*)malloc(sizeof(SeqStack));
S1 = InitStack(20);
S2 = InitStack(20);
char *str = "2-2*8+3/2";
printf("%s",str);
//printf("55\n");
while(*str)
{
if(*str >= '0' && *str <= '9')
{
Push(S1,*str);
//printf("11\n");
}
else
{
//printf("77\n");
if(S2 ->top == -1)
{
//printf("7788\n");
Push(S2,*str);
//printf("66\n");
}
else
{
if((S2 ->elem[S2 ->top] == '+' || S2 ->elem[S2 ->top] == '-') && (*str == '*' || *str == '/'))
{
Push(S2,*str);
//printf("33\n");
}
else
{
char a,b,c;
int d;
Pop(S2,&c);
Pop(S1,&a);
Pop(S1,&b);
//printf("22\n");
switch (c)
{
case '+': d = (b -48) + (a - 48);break;
case '-': d = (b -48) - (a - 48);break;
case '*': d = (b -48) * (a - 48);break;
case '/': d = (b -48) / (a - 48);break;
}
//printf("d : %d\n",d);
//printf("c : %c\n",c);
Push(S1,d + 48);
continue;
}
}
}
str++;
}
char a,b,c;
int d;
if(*str == '\0')
{
while(S1 ->top != -1 && S2 ->top != -1)
{
Pop(S2,&c);
Pop(S1,&a);
Pop(S1,&b);
switch (c)
{
case '+': d = (b -48) + (a - 48);break;
case '-': d = (b -48) - (a - 48);break;
case '*': d = (b -48) * (a - 48);break;
case '/': d = (b -48) / (a - 48);break;
}
//printf("d : %d\n",d);
Push(S1,d + 48);
}
}
printf(" = %d\n",d);
}