后缀表达式计算

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_37245458/article/details/89074781

问题描述:计算机很难处理中缀表达式的计算,即我们的思维想的表达式,所以应该把中缀表达式转换为后缀表达式对输入式进行计算。

分析:先把中缀表达式转换为后缀表达式,则取字符串中的每个字符进行判断;对于一个运算符如果优先级低于操作符栈中的栈顶字符,则把栈中的其它字符全部输出到新的字符串中;否则把这个运算符加入到操作符栈中。

解题思路:计算时,取新字符串中的数字放入操作数栈中,读到操作符时,从栈中取出两个操作数进行计算重新放回操作数栈中,重复进行此操作直到字符串读完。最终的结果保存在操作数栈顶。

/* 后缀表达式计算方法 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <iostream>
#include <stack>
#include <string>
using namespace std;

// 中缀转后缀表达式
void
midfix_to_backfix(string raw_s,
	int length,
	string& modify_s) {
	stack<char> symbol;
	for (int i = 0; i < length; i++) {
		if (raw_s[i] >= '0' && raw_s[i] <= '9') {
			while (i < length - 1) {
				if (raw_s[i] >= '0' && raw_s[i] <= '9') {
					modify_s.push_back(raw_s[i]);
					i++;
				}
				else
					break;
			}
			modify_s.push_back(' ');
		}
		else if (raw_s[i] == '+' || raw_s[i] == '-' 
			|| raw_s[i] == '*' || raw_s[i] == '/') {
			while (!symbol.empty() && (symbol.top() == '*' || symbol.top() == '/')) {
				modify_s.push_back(symbol.top());
				modify_s.push_back(' ');
				symbol.pop();
			}
			symbol.push(raw_s[i]);
		}
		else if (raw_s[i] == '(')
			symbol.push(raw_s[i]);
		else if (raw_s[i] == ')') {
			while (symbol.top() != '(') {
				modify_s.push_back(symbol.top());
				modify_s.push_back(' ');
				symbol.pop();
			}

			if (symbol.top() == '(')
				symbol.pop();
		}
	}

	while (!symbol.empty()) {
		modify_s.push_back(symbol.top());
		modify_s.push_back(' ');
		symbol.pop();
	}
	modify_s.push_back(raw_s[length - 1]);
}

// 对后缀表达式进行转换计算
void
backfix_expression_construct(string raw_s,
	int length,
	stack<int> stk_i_num,
	stack<char> stk_c_symbol,
	int& result) {
	int temp = 0;
	for (int i = 0; i < length; i++) {
		if (raw_s[i] >= '0' && raw_s[i] <= '9') {
			temp *= 10;
			temp += raw_s[i] - '0';
		}
		else if (raw_s[i] == '+' || raw_s[i] == '-' 
			|| raw_s[i] == '*' || raw_s[i] == '/') {
			int result = 0;
			int i_left = 0, i_right = 0;
			i_right = stk_i_num.top();
			stk_i_num.pop();
			i_left = stk_i_num.top();
			stk_i_num.pop();

			switch (raw_s[i]) {
			case '+':
			{
				result = i_right + i_left;
				break;
			}
			case '-':
			{
				result = i_left - i_right;
				break;
			}
			case '*':
			{
				result = i_right * i_left;
				break;
			}
			case '/':
			{
				result = i_left / i_right;
				break;
			}
			default:
				break;
			}
			stk_i_num.push(result);
		}
		else {
			if (raw_s[i] == '=') {
				result = stk_i_num.top();
				break;
			}
			if (i - 1 >= 0 && raw_s[i - 1] >= '0' && raw_s[i - 1] <= '9') {
				stk_i_num.push(temp);
				temp = 0;
			}
		}
	}
}

int main(int argc, char** argv) {
	stack<int> stk_i_num;
	stack<char> stk_c_symbol;

	string s;
	getline(cin, s);
	s.push_back('=');
	
	string modify_s;
	midfix_to_backfix(s, s.length(), modify_s);

	int result = 0;
	backfix_expression_construct(modify_s, modify_s.size(), stk_i_num, stk_c_symbol, result);
	// backfix_expression_solve_value(stk_i_num, stk_c_symbol, result);
	cout << result << endl;

	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37245458/article/details/89074781
今日推荐