/*参考中缀式转换成后缀式的运算过程
运算过程:设立一个栈1,存放数字
设立一个栈2,存放运算符,首先栈为空,编译程序从左到右扫描中缀表达式,
若遇到操作数,合成数字,压栈1
若遇到运算符,则必须与栈2顶比较,运算符级别比栈顶级别高则进栈,否则退出栈2顶元素并运算
若遇到左括号,进栈2;若遇到右括号,则一直退栈2运算,直到退到左括号止当栈2变成空时,输出栈1顶数据
测试用例(4+3)*(2+3)失败,继续尝试*/
#include<iostream.h>
#include<stdio.h>
void main()
{
char str[128];
int stack1[128]={0};//数字栈
char stack2[128];//运算符栈
stack2[0]='1';
char *p;
p=str;
int*q1;
char *q2;
q1=stack1;
q2=stack2;
int sum1,sum2;
cout<<"请输入待处理的中缀运算式!"<<endl;
cout<<"输入的中缀运算式符合以下要求: "<<endl;
cout<<"(1) 中缀运算式在逻辑上和结构上无错。"<<endl;
cout<<"(2) 中缀运算式长度不确定但不超过128个。"<<endl;
cout<<"(3) 中缀运算式仅出现在一行输入行中。"<<endl;
cout<<"(4)中缀运算式中只包含4种2目运算符:+,-,*,/及两种优先级运算符(和)。"<<endl;
cout<<"(5) 中缀运算式中的运算数由{0,1,…,8,9}中的一或者不超过四个数字(暂时不可以包含小数点)。"<<endl;
cout<<"(6) 中缀运算式中不包含多余的空格。"<<endl;
p=gets(str);//从键盘输入该表达式
while(*p!='/0')
{
if(*p>='0'&&*p<='9')//字符到数字的转换
{
if((*(p-1)=='+')||(*(p-1)=='-')||(*(p-1)=='*')||(*(p-1)=='/'))//如果前一个字符是运算符
{
q1++;
*q1=0;
}
int sum;
switch(*p)
{
case'0':sum=0;break;
case'1':sum=1;break;
case'2':sum=2;break;
case'3':sum=3;break;
case'4':sum=4;break;
case'5':sum=5;break;
case'6':sum=6;break;
case'7':sum=7;break;
case'8':sum=8;break;
case'9':sum=9;break;
}
*q1=*q1*10+sum;
}
else
{
if(*p=='('||*p==')')//左括号或者右括号
{
if(*p=='(')//左括号,进栈
{
q2++;
*q2=*p;
}
else//右括号,出栈到左括号
{
while(*q2!='(')
{
sum1=*q1;
q1--;
sum2=*q1;
switch(*q2)
{
case'+':*q1=sum2+sum1;break;
case'-':*q1=sum2-sum1;break;
case'*':*q1=sum2*sum1;break;
case'/':*q1=sum2/sum1;break;
}
q2--;
}
q2--;
}
}
else
{
if(((*p=='*'||*p=='/')&&(*q2=='+'||*q2=='-'))||*q2=='1'||*q2=='(')//优先级比栈顶高
{
q2++;
*q2=*p;
}
else
{
sum1=*q1;
q1--;
sum2=*q1;
switch(*q2)
{
case'+':*q1=sum2+sum1;break;
case'-':*q1=sum2-sum1;break;
case'*':*q1=sum2*sum1;break;
case'/':*q1=sum2/sum1;break;
}
q2--;
p--;
}
}
}
p++;
}
while(*q2!='1')//栈中元素全部出栈
{
sum1=*q1;
q1--;
sum2=*q1;
switch(*q2)
{
case'+':*q1=sum2+sum1;break;
case'-':*q1=sum2-sum1;break;
case'*':*q1=sum2*sum1;break;
case'/':*q1=sum2/sum1;break;
}
q2--;
}
cout<<*q1<<endl;
}