AcWing 3302. 表达式求值

Posted MangataTS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing 3302. 表达式求值相关的知识,希望对你有一定的参考价值。

题目连接

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

思路

我们用一个map记录不同符号的一个优先级,然后用两个栈分别记录数字和操作符,如果当前的符号是右括号,那么我们就得强制处理到左括号去,如果当前读到的是一个数字,那么我们直接把数字放入数字栈里面就好了,如果当前读到的是一个运算符,那么我们就得先处理栈中优先级大于等于当前运算符的一些运算,最后将当前的运算符加入到栈中,那么这个栈就一个运算符单调递增的一个栈,详情请看代码

代码

#include<bits/stdc++.h>
using namespace std;

unordered_map<char,int> pr'+',1,'-',1,'*',2,'/',2;

stack<int> num;
stack<char> op;

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


int main()

	string ch;
	cin>>ch;
	int n = ch.size();
	for(int i = 0;i < n; ++i) 
		if(isdigit(ch[i]))
			int ans = 0;
			while(isdigit(ch[i])) ans = ans * 10 + ch[i]-'0',++i;
			num.push(ans);
			--i;
		
		else if(ch[i] == '(')//如果是左括号那么直接放进来就好了
			op.push(ch[i]);
		
		else if(ch[i] == ')')//如果是右括号那么我们直接输出
			while(op.top() != '(')
				eval();
			
			op.pop();//删除左括号
		
		else
			//如果当前的栈顶符号的优先级比我们当前的优先级高或者相等那么就先把之前的处理了
			//例如来看这样一个表达式:2*10-1000+24-(5*3)+(3*2) => 20-1000+24-15+6 如果不处理相等的话我们就多减去了一个6,少加了一个6
			while(op.size() && pr[op.top()] >= pr[ch[i]]) eval();
			op.push(ch[i]);//将当前的符号放进符号栈里面
		
	
	while(op.size()) 
		eval();
	cout<<num.top()<<endl;
	return 0;

以上是关于AcWing 3302. 表达式求值的主要内容,如果未能解决你的问题,请参考以下文章

表达式求值(无括号)

栈的应用 -- 无括号表达式的求值

中缀表达式求值

中缀表达式求值

表达式求值

中缀表达式求值