您的位置:首页 > 其它

[河南省ACM省赛-第四届] 表达式求值(nyoj 305)

2015-04-01 21:02 393 查看
栈的模拟应用:



#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<algorithm>
#include<stack>
using namespace std;

string getPostfixExp(string s)
{
stack<char> sta;// d n x
string exp;
int len = s.size();
for(int i=0; i<len; i++){
char ch = s[i];
if(ch == 'a' || ch == 'm') { //如果是字母
i += 2;
sta.push(s[i]);
} else if(ch == '('){
sta.push(ch);
} else if(ch == ')'){//此时顶一定是(
sta.pop();//弹走(
exp += " ";
exp += sta.top();
sta.pop();
} else if(ch != ','){ //数字
string num;
while(s[i] >= '0' && s[i] <= '9'){
num += s[i++];
}
if(exp[0] != NULL)//后缀表达式的第一个一定是数字,用此来避免首位空格
exp += " ";
exp += num;
i--;
}
}
return exp;
}

int calculate(string post)
{
stack<int>sta;
int len = post.size();
for(int i=0; i<len; i++){
int ch = post[i];
if(ch >= 'a') {//如果是运算符
int a = sta.top(); sta.pop();
int b = sta.top(); sta.pop();
if(ch == 'd')
sta.push(a+b);
else if(ch == 'x')
sta.push(max(a, b));
else if(ch == 'n')
sta.push(min(a, b));
} else if(ch != ' ') {//如果为数字
int num = 0;
while(post[i] >= '0' && post[i] <= '9')
num = num*10+post[i++]-'0';
sta.push(num);
i--;
}
}
return sta.top();
}
int main()
{
freopen("d:\\in.txt", "r", stdin);
string s;
int t;
cin>>t;
while(t--) {
cin>>s;
string post = getPostfixExp(s);
cout<<calculate(post)<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: