每日一题-数据结构

#include <bits/stdc++.h>

using namespace std;

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

stack<int> num;

stack<char> op;

void eval() {
	auto b = num.top();
	num.pop();
	auto a = num.top();
	num.pop();
	
	auto ch = op.top();
	op.pop();
	
	if (ch == '*') {
		num.push(a * b);
	}
	if (ch == '+') {
		num.push(a + b);
	}
	if (ch == '-') {
		num.push(a - b);
	}
	if (ch == '/') {
		num.push(a / b);
	}
}

int main() {
	string s;
	cin >> s;
	
	for (int i = 0; s[i]; ++i) {
		auto c = s[i];
		if (isdigit(c)) {
			int x = 0, j = i;
			while (s[j] and isdigit(s[j])) {
				x = x * 10 + s[j++] - '0';
			}
			i = j - 1;
			num.push(x);
		} else if (c == '(') {
			op.push('(');
		} else if (c == ')') {
			while (op.top() != '(') {
				eval();
			}
			op.pop();
		} else {
			while (op.size() and op.top() != '(' and pr[op.top()] >= pr[c]) {
				eval();
			}
			op.push(c);
		}
	}
	while (op.size()) {
		eval();
	}
	cout << num.top() << '\n';
	return 0;
}

用栈模拟对中缀表达式求值.

posted on 2022-12-06 11:42  Whosedream-0019  阅读(28)  评论(0)    收藏  举报

导航