假定算数表达式的值均为非负整数常数,不包含变量、小 数和字符常量。 试设计一个算术四则运算表达式求值的简单计算器。 基本要求: 1、 操作数均为非负整数常数,操作符仅为+、-、*、/、(和); 2、 编写 main 函数进行测试。给出详细注释
时间: 2023-06-10 15:04:59 浏览: 45
好的,我明白了,您的问题是如何设计一个算术四则运算表达式求值的简单计算器。
首先,我们需要了解算术表达式的求值方法,一般来说可以使用栈来实现。具体的实现方法如下:
1. 定义两个栈,一个用来存储操作数,一个用来存储运算符。
2. 从左到右遍历表达式中的每个元素,如果当前元素是一个数字,就将它压入操作数栈中;如果是一个运算符,就与运算符栈的栈顶元素比较优先级,如果当前运算符优先级高于栈顶运算符,就将当前运算符压入运算符栈中;否则,就将运算栈顶运算符弹出并进行运算,将结果压入操作数栈中,直到当前运算符优先级高于栈顶运算符为止。注意:这里的优先级顺序为:括号 > 乘、除 > 加、减。
3. 当遍历完整个表达式后,如果运算符栈不为空,就将栈中剩余的运算符依次弹出并进行运算,将结果压入操作数栈中。
4. 最后操作数栈中的栈顶元素即为表达式的求值结果。
以下是实现代码及注释:
```c++
#include <iostream>
#include <stack>
#include <string>
using namespace std;
// 定义操作数栈和运算符栈
stack<int> nums;
stack<char> ops;
// 判断运算符优先级的函数(乘、除 > 加、减)
int priority(char op) {
if (op == '*' || op == '/') return 2;
else return 1;
}
// 进行运算的函数
void eval() {
// 弹出操作数
int b = nums.top();
nums.pop();
int a = nums.top();
nums.pop();
// 弹出运算符
char op = ops.top();
ops.pop();
// 进行运算并将结果压入操作数栈中
int res;
switch(op) {
case '+': res = a + b; break;
case '-': res = a - b; break;
case '*': res = a * b; break;
case '/': res = a / b; break;
}
nums.push(res);
}
// 计算表达式的函数
int calculate(string s) {
// 将表达式中的空格全部去掉
s.erase(remove(s.begin(), s.end(), ' '), s.end());
// 遍历表达式中的每个字符
for (int i = 0; i < s.size(); i++) {
char c = s[i];
// 如果当前字符是数字,就将它压入操作数栈中
if (isdigit(c)) {
int num = 0;
while (isdigit(s[i])) {
num = num * 10 + (s[i] - '0');
i++;
}
i--;
nums.push(num);
}
// 如果当前字符是运算符
else if (c == '+' || c == '-' || c == '*' || c == '/') {
// 将运算符与运算符栈的栈顶元素进行比较
// 如果当前运算符优先级高于栈顶元素,就将当前运算符压入运算符栈中
// 否则,就弹出栈顶元素进行运算,并将运算结果压入操作数栈中
while (!ops.empty() && priority(ops.top()) >= priority(c)) {
eval();
}
ops.push(c);
}
// 如果当前字符是左括号,就将它压入运算符栈中
else if (c == '(') {
ops.push(c);
}
// 如果当前字符是右括号,就弹出运算符栈中的元素进行运算
else if (c == ')') {
while (ops.top() != '(') {
eval();
}
ops.pop(); // 弹出左括号
}
}
// 如果运算符栈不为空,就依次弹出运算符进行运算
while (!ops.empty()) {
eval();
}
// 最终操作数栈中的栈顶元素即为表达式的求值结果
return nums.top();
}
int main() {
string s;
cout << "请输入算术表达式:" << endl;
getline(cin, s); // 支持输入含有空格的表达式
int res = calculate(s);
cout << "结果为:" << res << endl;
return 0;
}
```
希望这个算术四则运算表达式求值的简单计算器能够满足您的要求。不过需要注意的是,本算法只适用于非负整数常数,如果涉及到浮点数或负数的运算,需要进行相应的修改。