【模板】表达式求值

代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=1010;
stack<int> num;
stack<char> ops;
char s[maxn];
inline int grade(char s){return s=='('?1:s=='+'||s=='-'?2:3;}
inline void calc(char op){
	int x=num.top();num.pop();
	int y=num.top();num.pop();
	if(op=='+')num.push(x+y);
	else if(op=='-')num.push(x-y);
	else if(op=='*')num.push(x*y);
	else num.push(x/y);
}
int solve(char *s){
	int val=0;
	for(int i=1;i<=strlen(s+1);i++){
		if(isdigit(s[i])){
			val=val*10+s[i]-'0';
			if(isdigit(s[i+1]))continue;
			num.push(val);val=0;
		}else if(s[i]=='(')ops.push(s[i]);
		else if(s[i]==')'){
			while(ops.top()!='(')calc(ops.top()),ops.pop();
			ops.pop();
		}else{
			while(ops.size()&&grade(ops.top())>=grade(s[i]))calc(ops.top()),ops.pop();
			ops.push(s[i]);
		}
	}
	while(ops.size())calc(ops.top()),ops.pop();
	return num.top();
}
int main(){
	scanf("%s",s+1);
	printf("%d\n",solve(s));
	return 0;
}
posted @ 2018-10-14 20:08  shellpicker  阅读(232)  评论(0编辑  收藏  举报