#include<iostream>
using namespace std;
#include<stack>
#define maxSize 100
stack<char> stack1; //栈来放后缀表达式的符号
char suffix[maxSize]; //转化后的后缀表达式
int n=-1; //表示suffix字符数组的index,初始化为-1
int prior(char op)
{
if(op=='(')
return 0;
if(op=='+'||op=='-')
return 1;
if(op=='*'||op=='/')
return 2;
}
void compare_prior(stack<char>&stack1, char op)
{
int level=prior(op);
while(!stack1.empty())
{
if(prior(stack1.top())>level) //后缀表达式顺序运算,所以符号肯定是先放高优先级的。若乘除遇加减,或遇(,都立即写到后缀表达式中
{
char p=stack1.top();
suffix[++n]=p;
stack1.pop();
}
else
break;
}
return;
}
void infixToSuffix(char a[]) //中缀(正常)表达式->后缀表达式
{
for(int i=0;a[i]!='\0';i++)
{
if(a[i]>='0'&&a[i]<='9') //数字就直接放到后缀表达式即可,只是要考虑“多位数”的情况——就看前面是空格还是数字即可
{
if(a[i-1]>='0'&&a[i-1]<='9')
{
suffix[++n]=a[i];
}
else
{
suffix[++n]=' ';
suffix[++n]=a[i];
}
}
if(a[i]=='+'||a[i]=='-')
{
compare_prior(stack1,a[i]);
stack1.push(a[i]);
}
if(a[i]=='*'||a[i]=='/'||a[i]=='(') //乘除只在遇到加减之后采取执行,显示进栈等着。
stack1.push(a[i]);
if(a[i]==')') //遇到右括号,把这个括号中的所有运算(包括加减)都拿出来到后缀表达式中表示优先运算
{
char p=stack1.top();
while(!stack1.empty() && p!='(')
{
stack1.pop();
suffix[++n]=p;
p=stack1.top();
}
if(p=='(')
stack1.pop(); //注意!!多重括号时易忽略
}
}
while(!stack1.empty()) //若到底,则把最后的运算符全部输出
{
char p=stack1.top();
if(p=='(')
stack1.pop();
else
{
suffix[++n]=p;
stack1.pop();
}
}
}
int op(int a,char Op,int b)
{
if(Op=='+') return a+b;
if(Op=='-') return a-b;
if(Op=='*') return a*b;
if(Op=='/')
{
if(b==0) //小心!
{
cout<<"ERROR"<<endl;
return 0;
}
else
return a/b;
}
}
int calculate(char suffix[])
{
stack<int> stack2;
for(int i=0;suffix[i]!='\0';i++)
{
if(suffix[i]>='0'&&suffix[i]<='9')
{
if(suffix[i-1]==' ')
stack2.push(suffix[i]-'0');
else if(suffix[i-1]>=0||suffix[i-1]<=9)
{
stack2.top()=stack2.top()*10+(suffix[i]-'0'); //
}
}
else if(suffix[i]==' ')
{
continue;
}
else
{
int b=stack2.top();
stack2.pop();
int a=stack2.top();
stack2.pop();
int c=op(a,suffix[i],b);
stack2.push(c);
}
}
return stack2.top();
}
int main()
{
cout<<"请输入中缀表达式:"<<endl;
char infix[maxSize];
cin>>infix;
infixToSuffix(infix);
suffix[n+1]='\0'; //表示后缀表达式已全部传入字符数组。这样就把运算次序最终定下来,只需要按后缀表达式顺序计算即可
// cout<<"后缀式为:"<<suffix;
int result=calculate(suffix);
cout<<"计算结果为:"<<result;
return 1;
}