假定算数表达式的值均为非负整数常数,不包含变量、小 数和字符常量。 试设计一个算术四则运算表达式求值的简单计算器。 基本要求: 1、 操作数均为非负整数常数,操作符仅为+、-、*、/、(、); 2、 编写 main 函数进行测试
时间: 2023-11-08 11:05:40 浏览: 81
好的,我明白了。针对你的问题, 我可以使用如下的方法来实现一个算术四则运算表达式求值的简单计算器:
```
#include <iostream>
#include <stack>
using namespace std;
int priority(char op) {
if (op == '+' || op == '-') {
return 1;
} else if (op == '*' || op == '/') {
return 2;
} else {
return 0;
}
}
int operate(char op, int a, int b) {
if (op == '+') {
return a + b;
} else if (op == '-') {
return a - b;
} else if (op == '*') {
return a * b;
} else if (op == '/') {
return a / b;
} else {
return 0;
}
}
int calculate(string expression) {
stack<int> num_stack;
stack<char> op_stack;
for (int i = 0; i < expression.length(); i++) {
if (expression[i] == '(') {
op_stack.push('(');
} else if (isdigit(expression[i])) {
int num = expression[i] - '0';
while (i < expression.length() - 1 && isdigit(expression[i + 1])) {
num = num * 10 + (expression[i + 1] - '0');
i++;
}
num_stack.push(num);
} else if (expression[i] == '+' || expression[i] == '-' || expression[i] == '*' || expression[i] == '/') {
while (!op_stack.empty() && priority(op_stack.top()) >= priority(expression[i])) {
int b = num_stack.top();
num_stack.pop();
int a = num_stack.top();
num_stack.pop();
char op = op_stack.top();
op_stack.pop();
num_stack.push(operate(op, a, b));
}
op_stack.push(expression[i]);
} else if (expression[i] == ')') {
while (op_stack.top() != '(') {
int b = num_stack.top();
num_stack.pop();
int a = num_stack.top();
num_stack.pop();
char op = op_stack.top();
op_stack.pop();
num_stack.push(operate(op, a, b));
}
op_stack.pop();
}
}
while (!op_stack.empty()) {
int b = num_stack.top();
num_stack.pop();
int a = num_stack.top();
num_stack.pop();
char op = op_stack.top();
op_stack.pop();
num_stack.push(operate(op, a, b));
}
return num_stack.top();
}
int main() {
string expression = "(2+3)*5";
int result = calculate(expression);
cout << result << endl;
return 0;
}
```
在这个实现中,我们是通过栈来实现对于不同计算符号的处理的。我们先将数字压入数字栈中,同时我们不断遍历输入的表达式进行处理。如果遇到了左括号,我们则将左括号压入符号栈中;如果遇到数字,则将数字提取出来,并压入数字栈中;如果遇到了计算符号,则需要依据计算规则来进行计算,这时候我们比较它的优先级,只有当当前计算符号的优先级小于栈顶的计算符号时,才会进行计算。计算完成后,我们再将结果压入数字栈中,随后将当前计算符号压入符号栈中;如果遇到了右括号,则需要一直从符号栈中取出运算符,直到遇到左括号为止。最后,我们再对于剩下的运算符进行处理,直到数字栈中只剩下一个元素,即最后的计算值。
阅读全文