中綴表示式轉化為字尾表示式並求值

qq_41852306發表於2020-10-11

程式碼功能:將輸入的中綴表示式轉化為字尾表示式並進行一個值的求,支援括號。

思路:見程式碼。

#include <iostream>
#include <stack>
#include <string>
#include <vector>

using namespace std;

void showAndPush(vector<string> &expr, const string &s, char t = ' ') {
	expr.push_back(s);
	cout << s << t;
}

bool isOper(const string &s) {
	return s.length() > 0 && (s[0] == '+' || s[0] == '-' || s[0] == '*' || s[0] == '/');
}

int cal(int num, int num1, char oper) {
	switch (oper) {
	case '+': return num + num1;
	case '-': return num - num1;
	case '*': return num * num1;
	case '/': return num / num1;
	}
}

void infixToSuffix(int &p, const string &text, vector<string> &expr) {
	stack<char> stk;
	int len = text.length();
	for (; p < len; ++p) {
		switch (text[p]) {
		case '+':
		case '-':
			while (!stk.empty() && (stk.top() == '*' || stk.top() == '/')) {
				cout << stk.top(); stk.pop();
			}
			stk.push(text[p]);
			break;
		case '*':
		case '/':
			stk.push(text[p]);
			break;
		case '(':
			infixToSuffix(++p, text, expr);
			break;
		case ')':
			while (!stk.empty()) {
				showAndPush(expr, string(1, stk.top()));
				stk.pop();
			}
			return;
		default:
			string num;
			while (isdigit(text[p])) {
				num.push_back(text[p]);
				++p;
			}
			--p;
			showAndPush(expr, num);
		}
	}
	while (!stk.empty()) {
		showAndPush(expr, string(1, stk.top()));
		stk.pop();
	}
}

int calculate(const vector<string> &expr) {
	stack<int> num;
	for (auto &iter : expr) {
		if (isOper(iter)) {
			int t = num.top(); num.pop();
			int t1 = num.top(); num.pop();
			num.push(cal(t,t1,iter[0]));
		} else {
			num.push(stoi(iter));
		}
	}
	return num.top();
}

void sln() {
	string text;
	cin >> text;
	vector<string> expr;
	int p = 0;
	infixToSuffix(p, text, expr);
	cout << endl;
	cout << calculate(expr) << endl;
}

int main() {
	sln();
	return 0;
}
  •  

執行截圖:

在這裡插入圖片描述

未處理除零、括號不匹配以及出現非法字元等錯誤。

相關文章