问题分析
Exp = a * b + c - d / f
- 确定计算规则,即明确运算符的优先级
- 确定当前处理字符是运算符还是操作数
- 每个运算符的运算次序要由它之后的一个运算符来定
算法思路
Exp = # a * b + c - d / f #
- 设立操作数栈和操作符栈
- 设表达式的结束符为“#”,预设运算符栈的栈底为“#”
- 若当前字符是操作数,则直接压入操作数栈
- 若当前字符是操作符,则与操作符栈的栈顶运算符进行优先级比较
-
- 若优先级高于栈顶运算符则进栈
-
- 若优先级低于栈顶运算符则从操作数栈中弹出两个操作数a,b,从操作符栈中弹出一个运算符Ω,经计算后将结果T压入操作数栈
图解
代码实现
#include <iostream>
using namespace std;
char operation[1000];
int Calculate (int a, char b, int c) {
if (b == '+') {
return a + c;
} else if (b == '-') {
return a - c;
} else if (b == '*') {
return a * c;
} else if (b == '/') {
return a / c;
}
return 0;
}
int Compare (char a) {
if (a == '+' || a == '-') {
return 1;
} else if (a == '*' || a == '/') {
return 2;
} else if (a == '#') {
return 0;
} else cout << "格式错误";
return 0;
}
int main(int argc, const char * argv[]) {
int numberStack[100] = {0};
int numberTop = -1;
char symbolStack[100] = {'#'};
int symbolTop = -1;
int tempNumber = 0;
bool judge = false;
cin >> operation;
for (int i = 0; i < strlen(operation); i++) {
if (operation[i] >= '0' && operation[i] <= '9') {
tempNumber = tempNumber * 10 + operation[i] - '0';
judge = false;
} else {
if (judge == false) {
numberStack[++numberTop] = tempNumber;
tempNumber = 0;
judge = true;
}
if (symbolTop == -1) {
symbolStack[++symbolTop] = operation[i];
} else if (Compare(symbolStack[symbolTop]) < Compare(operation[i])) {
symbolStack[++symbolTop] = operation[i];
} else {
int a = numberStack[numberTop--];
char b = symbolStack[symbolTop--];
int c = numberStack[numberTop--];
tempNumber = Calculate (a, b, c);
numberStack[++numberTop] = tempNumber;
if (operation[i] == '#') {
cout << numberStack[numberTop] << endl;
break;
}
tempNumber = 0;
i--;
}
}
}
}