题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=257
解题思路:没有什么特殊的解题方法,只需注意一下后缀表达式运算最后结果应该是中缀从左向右运算的结果:
比如1+2*(4+5)+6,结果应该是1245+*+6+而不是1245+*6++。
sstream头文件中包含一个名为stringstream的I/O类,可以实现字符串中数字的类型转换使用初始化如下:
stringstream ss;
string s;
cin>>s;
ss.clear(); //清空流缓存
ss<<s; //将字符串s写入字符流
几个重要的函数要说明一下:
unget() ----unget()把读出的数据重新放入流中
下面直接附上鄙人的代码:
#include<stdio.h>
#include<iostream>
#include<sstream>
#include<string>
#include<stack>
#include<cctype>
using namespace std;
int getRank(char op) { //satck.top>=op时压栈
if(op == '+') return 1;
if(op == '-') return 1;
if(op == '*') return 2;
if(op == '/') return 2;
if(op == '(') return 0;
}
int main() {
// freopen("data.in", "r", stdin);
char op;
int n, value;
string str;
stringstream ss;
stack<char> ops;
scanf("%d", &n);
while(n--) {
cin>>str;
ss.clear();
ss<<str;
while(ss>>op) {
if(isdigit(op)) {
ss.unget(); ss>>value;
printf("%d", value);
} else {
if(op == ')') {
while(ops.top() != '(') {
printf("%c", ops.top());
ops.pop();
}
ops.pop();
} else {
if(ops.empty() || op == '(' || getRank(op) > getRank(ops.top())) {
ops.push(op);
} else {
while(!ops.empty() && getRank(op) <= getRank(ops.top())) {
printf("%c", ops.top());
ops.pop();
}
ops.push(op);
}
}
}
}
while(!ops.empty()) {
printf("%c", ops.top());
ops.pop();
}
printf("\n");
}
return 0;
}