表达式树
#include<iostream>
#include<string.h>
#include<string>
#include<stack>
#include<queue>
using namespace std;
/*
算法:
遍历字符串s,用另一个字符串ss储存后缀式
①若为值,直接加在ss后面
②若为'(',入符号栈
③若为')',输出之前的元素直到遇到')'
④若为运算符,将符号栈符号弹出并加到ss后面
⑤遍历完后,将栈中剩余符号加到ss后面
*/
string trans(string s){
stack<char>cal;
string ss="";
int len=s.length();
for(int i=0;i<len;i++){
if(s[i]=='(')//若为'(',入符号栈
cal.push(s[i]);
else if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'){//若为运算符,将符号栈符号弹出并加到ss后面
while(!cal.empty()){
char tmp=cal.top();
if(tmp=='(')
break;
cal.pop();
ss+=tmp;
}
cal.push(s[i]);
}
else if(s[i]==')'){//若为')',输出之前的元素直到遇到')'
while(!cal.empty()){
char tmp=cal.top();
cal.pop();
if(tmp=='(')
break;
ss+=tmp;
}
}
else//若为值,直接加在ss后面
ss+=s[i];
}
// /遍历完后,将栈中剩余符号加到ss后面
while(!cal.empty()){
char tmp=cal.top();
cal.pop();
ss+=tmp;
}
return ss;
}
int main(){
string s="(A+B)*((C-D)*E+F)";
cout<<trans(s)<<endl;
return 0;
}