版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
问题描述:计算机很难处理中缀表达式的计算,即我们的思维想的表达式,所以应该把中缀表达式转换为后缀表达式对输入式进行计算。
分析:先把中缀表达式转换为后缀表达式,则取字符串中的每个字符进行判断;对于一个运算符如果优先级低于操作符栈中的栈顶字符,则把栈中的其它字符全部输出到新的字符串中;否则把这个运算符加入到操作符栈中。
解题思路:计算时,取新字符串中的数字放入操作数栈中,读到操作符时,从栈中取出两个操作数进行计算重新放回操作数栈中,重复进行此操作直到字符串读完。最终的结果保存在操作数栈顶。
/* 后缀表达式计算方法 */
#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;
}