表达式树

#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;
}
原文地址:https://www.cnblogs.com/aeipyuan/p/12285302.html