//中缀转后缀
#include<iostream>
#include<stack>
using namespace std; int prio(char x){
if(x=='*'||x=='/') return ;
if(x=='+'||x=='-') return ;
if(x=='(') return ;
else return -; }
void in_to_post(char* inorder,char* &post){
stack<char>S;
int k=;
while(*inorder){
//数字
if(*inorder>=''&&*inorder<=''){
post[k++] = *inorder;
}
//操作符
else{
if(S.empty()) {
S.push(*inorder);
}
else if(*inorder=='('){
S.push(*inorder);
}
else if(*inorder==')'){
while(S.top()!='('){
post[k++]=S.top();
S.pop();
}
S.pop();
}
else{
while(prio(*inorder)<=prio(S.top())){
post[k++]=S.top();
S.pop();
if(S.empty()) break;
}
S.push(*inorder);
}
}
inorder++;
}
if(!S.empty()){
char c =S.top();
post[k++] = c;
S.pop();
}
}
//后缀表达式求值
int cal(int a,int b,char c){
if(c=='+') return a+b;
else if(c=='-') return a-b;
else if(c=='*') return a*b;
else if(c=='/') return a/b;
else return ;
} int postcal(char* post){
stack <int > s;
while(*post){
if(*post >=''&& *post<=''){
s.push(*post);
}
else{
int a = s.top()-;
s.pop();
int b = s.top()-;
s.pop();
int c = cal(b,a,*post);
s.push(c+);
}
post++;
}
return s.top()-;
} int main(){
cout<<"输入中缀表达式:"<<endl;
char* inorder =new char;
cin>>inorder;
char* post= new char;
cout<<"后缀表达式为:";
in_to_post(inorder,post);
cout<<post<<endl;
int res = postcal(post);
cout<<"后缀表达式计算结果:"<<res<<endl;
}
求解思想:
中缀转后缀表达式:
从左到右扫描输入的中缀表达式,若是数字,则直接输出到结果,若是运算符则判断:
1. ‘(’ :直接入栈;
2. ‘)’:依次把栈中的运算符输出到结果,知道出现‘(’,将左括号从栈中删除;
3. 若是其他运算符,判断当前运算符与栈顶元素的优先级(*/ 为2,+-为1,( 为0,其他为-1),若是当前运算符优先级较高,则直接入栈,否则,依次输入比当前运算符优先级高或相等的运算符,知道遇到不符合条件的元素或者遇到左括号为止,再将当前运算符入栈。
扫描结束后,将栈内存放的运算符依次输出到结果。
例如:3*5+((1+3)/2+1)
3 放入结果; 结果:3 栈内:
* 放入栈内; 结果:3 栈内:*
5 放入结果; 结果:35 栈内:*
+:将*输入,+放入栈内 结果:35* 栈内:+
( 放入栈内; 结果:35* 栈内:+(
( 放入栈内; 结果:35* 栈内:+((
1 放入结果; 结果:35*1 栈内:+((
+ 放入栈内; 结果:35*1 栈内:+((+
3 放入结果; 结果:35*13 栈内:+((+
):输出+,删除(; 结果:35*13+ 栈内:+(
/ 放入栈内; 结果:35*13+ 栈内:+(/
2 放入结果; 结果:35*13+2 栈内:+(/
+: 输出/,+放入栈内; 结果:35*13+2/ 栈内:+(+
1 放入结果; 结果:35*13+2/1 栈内:+(+
):输出+,删除(; 结果:35*13+2/1+ 栈内:+
把栈内剩余元素依次输出; 结果:35*13+2/1++ 栈内:
后缀表达式求值:
从左到右扫描输入的后缀表达式,若是数字则入栈;若是操作符,则从栈中取出两个数,进行相应计算后,将结果放回栈中,;扫描完后,栈顶剩余元素就是结果。
由于输入时并未区分数字和操作符,而是统一规定成了char 类型,所以要将每两个操作数计算的结果也要转换成ASCII码对应的字符类型,所以要进行+-48的操作。
也可以在一开始读取输入的时候就区分int类型和char类型,然后分开设栈。