#include<iostream>
#include<stack>
#include<string>
//运算符号放在两个对象后面
//比较运算符号的优先级
using namespace std;
class C{
public:
stack<char> Change(string S){
//定义两个栈
stack<char> answer;
stack<char> stack2;
//遍历字符串元素
for(int i=0;i<S.size();i++){
//如果是运算符
if(S[i]=='+'||S[i]=='-'||S[i]=='*'||S[i]=='/'){
//空栈则直接入栈
if(stack2.empty()) stack2.push(S[i]);
else{
//栈非空,top为左括号直接入栈
if(stack2.top()=='('){
stack2.push(S[i]);
}else{
//栈非空,循环比较当前运算符和栈顶运算符的优先级
while(!stack2.empty()&&stack2.top()!='('){
//如果当前运算符优先,直接入栈,不再比较运算符,跳出循环
if((S[i]=='*'||S[i]=='/')&&(stack2.top()=='+'||stack2.top()=='-')){
stack2.push(S[i]);
break;
}else{
//否则输出栈顶元素,再次进行循环比较
cout<<stack2.top();
answer.push(stack2.top());
stack2.pop();
}
}
//如果空栈,将当前运算符入栈
if(stack2.empty()) stack2.push(S[i]);
}
}
}else if(S[i]=='('){
//如果为左括号,直接入栈
stack2.push(S[i]);
}else if(S[i]==')'){
//如果为右括号,将所有括号内剩余的运算符出栈,最后把左括号出栈
while(stack2.top()!='('){
cout<<stack2.top();
answer.push(stack2.top());
stack2.pop();
}
if(stack2.top()=='(') stack2.pop();
else cout<<"ERROR";
}else{
//如果为数字,直接输出
cout<<S[i];
answer.push(S[i]);
}
}
//最后把所有运算符输出,直到栈为空
while(!stack2.empty()){
cout<<stack2.top();
answer.push(stack2.top());
stack2.pop();
}
//answer即为最终后缀表达式的栈
//为了观察栈answer内部的元素,在过程中直接进行了输出
return answer;
}
};
int main()
{
C myC;
string S;
stack<char> result;
cout<<"Please enter a string:";
cin>>S;
cout<<"After change:";
result=myC.Change(S);
return 0;
}
运行结果:
算法框图: