后缀表达式的定义

知周所众,我们平时用的计算表达式都是 =中缀表达式= ,数字在 =操作符的两端= 。蛋柿,后缀表达式是把操作符放在对应=操作数之后= 。蓑衣,后缀表达式形式上相比中缀更加简略,因为它 去除了括号 ,后缀表达式在编程计算中有很大作用,我们通常需要将人类好处理的中缀表达式转化为计算机好处理的后缀表达式。(借鉴于@

计算后缀表达式思路

因为后缀表达式里,操作符在对应操作数的后面,所以,我们可以 在遇到了操作符之后,把前面两个数取出来,再进行运算 ,只可惜我们的旧数字不能放在原~神启动~本的地方,而只从一段弹出和读入的数据结构,栈可以轻松实现(还是借鉴于@

实现代码

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

int calc (string s) {
	stack<int> expStack;
	int num1, num2, res;
	char opt;
	for (int i = 0; i < int(s.size()); i++) {
		if (s.at(i) == ' ') {
			continue;
		}
		if (s.at(i) == '-' && s.at(i + 1) != '\0') {
			if (s.at(i + 1) >= '0' && s.at(i + 1) <= '9') {
				i++;
				int x = 0;
				while (s.at(i) != ' ') {
					x = x * 10 + s.at(i) - '0';
					i++;
				}
				i--;
				expStack.push(x * -1);
			}
		} else if (s.at(i) >= '0' && s.at(i) <= '9') {
			int x = 0;
			while (s.at(i) != ' ') {
				x = x * 10 + s.at(i) - '0';
				i++;
			}
			i--;
			expStack.push(x);
		} else {
			num1 = expStack.top();
			expStack.pop();
			num2 = expStack.top();
			expStack.pop();
			opt = s.at(i);
			switch (opt) {
			case '+':
				res = num2 + num1;
				break;
			case '-':
				res = num2 - num1;
				break;
			case '*':
				res = num2 * num1;
				break;
			case '/':
				res = num2 / num1;
				break;
			}
			expStack.push(res);
		}
	}
	return expStack.top();
}

int main() {
	string s;
	getline(cin, s);
	cout << calc(s) << endl;
	return 0;
}

支持负数以及多位数的qwq!