SPOJ Classical problems 4 TRANSFORM THE EXPRESSION(ONP)
http://www.spoj.pl/problems/ONP/
Transform the algebraic expression with brackets into RPN form (Reverse Polish Notation). Two-argument operators: +, -, *, /, ^ (priority from the lowest to the highest), brackets ( ). Operands: only letters: a,b,...,z. Assume that there is only one RPN form (no expressions like a*b*c).
Input
t [the number of expressions <= 100]
expression [length <= 400]
[other expressions]
Text grouped in [ ] does not appear in the input file.
Output
The expressions in RPN form, one per line.
Example
Input:
3
(a+(b*c))
((a+b)*(z+x))
((a+t)*((b+(a+c))^(c+d)))
Output:
abc*+
ab+zx+*
at+bac++cd+^*
中缀表达式转后缀表达式,使用栈即可。
这里用stl库,不过自己手写效率要高一些。
================================================
如为字母则放入结果
如为运算符,则将其与栈顶优先级比较,如低于栈顶则进栈,否则放入结果
左括号直接进栈,右括号退栈至最近的左括号
=================================================
1 #include <iostream> 2 #include <stack> 3 #include <cctype> 4 #include <vector> 5 #include <cstdio> 6 #include <string> 7 8 using namespace std; 9 10 char p[1000]; 11 12 int main() 13 { 14 freopen("in.txt", "r", stdin); 15 16 17 18 p['+'] = '1'; 19 p['-'] = '2'; 20 p['*'] = '3'; 21 p['/'] = '4'; 22 p['^'] = '5'; 23 24 25 int n; 26 cin >> n; 27 while (n--) 28 { 29 stack<char> st; 30 vector<char> cvec; 31 char c; 32 char priority = 6; 33 string str; 34 cin >> str; 35 36 for (int i=0; i<str.size(); ++i) 37 { 38 c = str[i]; 39 if (isalpha(c)) 40 { 41 cvec.push_back(c); 42 } 43 44 if (c == '(') 45 { 46 st.push(c); 47 priority = '6'; 48 } 49 if (c=='+' || c=='-' || c=='*' || c=='/' || c=='^') 50 { 51 if (p[c] >= priority) 52 { 53 cvec.push_back(c); 54 } 55 else 56 { 57 st.push(c); 58 priority = p[c]; 59 } 60 } 61 if (c == ')') 62 { 63 char retr = st.top(); 64 st.pop(); 65 66 while (retr != '(') 67 { 68 cvec.push_back(retr); 69 retr = st.top(); 70 st.pop(); 71 } 72 priority = '6'; 73 } 74 75 } 76 for (vector<char>::iterator iter=cvec.begin(); iter!=cvec.end(); ++iter) 77 { 78 cout << *iter; 79 } 80 cout << endl; 81 } 82 return 0; 83 }