题目
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 ab*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+(bc))
((a+b)(z+x))
((a+t)*((b+(a+c))^(c+d)))
Output:
abc*+
ab+zx+*
at+bac++cd+^*
逆波兰表达式 数据比较水 不用考虑太复杂
逆波兰表达式求法:从左往右遍历一遍原来的表达式
只要遇到的是字母,直接添加到答案里
如果遇到左括号 就存到临时的栈里
如果遇到右括号 就将栈顶的元素一个一个加到答案里
直到遇到左括号 左括号直接出栈
AC代码
#include <iostream>
#include <vector>
#include <cstring>
#include <stack>
using namespace std;
int n;
string op;
vector<char> ans;
stack<char> tmp;
int main()
{
cin >> n;
while(n--)
{
cin >> op;
for(int i = 0; i < op.size();i++)
{
if(op[i] >= 'a' && op[i] <= 'z')
{
ans.push_back(op[i]);
}
else if(op[i] != ')')
{
tmp.push(op[i]);
}
else
{
while(tmp.top() != '(')
{
ans.push_back(tmp.top());
tmp.pop();
}
tmp.pop();
}
}
for(int i = 0; i < ans.size(); i++)
{
cout << ans[i];
}
cout << endl;
ans.clear();
while(!tmp.empty()) tmp.pop();
}
return 0;
}