表达式求值

https://www.acwing.com/problem/content/3305/

input:
(2+2)*(1+1)

output:
8

#include<unordered_map>
const int N = 1e5 + 50;

stack<int>num;
stack<char>op;
char s[N]; 

void eval(){
	int b = num.top();
	num.pop();
	int a = num.top();
	num.pop();
	char c = op.top();
	op.pop();
	int x = 0;
	if(c == '+')x=a+b;
	else if(c == '-')x=a-b;
	else if(c == '*')x=a*b;
	else if(c == '/')x=a/b;
	num.push(x);
}

void work(){
	unordered_map<char,int>pr{{'+',1},{'-',1},{'*',2},{'/',2}};
	scanf("%s",s);
	int lena = strlen(s);
	for(int i=0;i<lena;i++){
		char c = s[i];
		if(isdigit(c)){
			int x=0,j=i;
			while(j<lena&&isdigit(s[j])){
				x=x*10+(s[j]-'0');
				j++;
			}
			i=j-1;
			num.push(x);
		}
		else if(c == '(')op.push(c);
		else if(c == ')'){
			while(op.top() != '(')eval();
			op.pop();
		}
		else {
			while(op.size() && pr[op.top()] >= pr[c])eval();
			op.push(c);
		} 
	}
	while(op.size())eval();
	printf("%d
",num.top());
}
原文地址:https://www.cnblogs.com/LaiYiC/p/15047015.html