中缀表达式转后缀表达式

我好菜,连这都不会了/kk

开一个栈存储符号。
读取到数字,直接输出。
读取到加减乘除符号,看栈顶符号的优先级是否大于等于新来的符号,如果\(\texttt{true}\),那么输出栈顶符号并弹出,一直输完所有满足条件的栈顶后再把新来的符号入栈。
读取到右括号,就不断输出栈顶直到栈顶为左括号,注意后缀表达式不需要括号。

注:我们定义加减的优先级为1,乘除的优先级最大为2,左括号的优先级最小为0。

\(\texttt{Code}\)

#include <bits/stdc++.h>

using namespace std;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	char x;
	int sum = 0;
	map<char, int> mp;
	mp['+'] = mp['-'] = 1;
	mp['*'] = mp['/'] = 2;
	mp['('] = mp[')'] = 0;
	stack<char> S;
	while (cin >> x) {
		if (isdigit(x)) {
			cout << x;
		} else if (x == '(') {
			S.push(x);			
		} else if (x == ')') {
			while (S.top() != '(') {
				cout << S.top();
				S.pop();
			}
			S.pop();
		} else {
			while (!S.empty() && mp[S.top()] >= mp[x]) {
				cout << S.top();
				S.pop();
			}
			S.push(x);
		}
	}
	while (!S.empty()) {
		cout << S.top();
		S.pop();
	}
	return 0;
}
posted @ 2022-07-19 18:41  zjsqwq  阅读(25)  评论(0编辑  收藏  举报