假定算数表达式的值均为非负整数常数,不包含变量、小 数和字符常量。 试设计一个算术四则运算表达式求值的简单计算器。 基本要求: 1、 操作数均为非负整数常数,操作符仅为+、-、*、/、(和); 2、 编写 main 函数进行测试。
时间: 2023-06-10 17:05:24 浏览: 42
好的,我明白了您的问题。以下是您需要的简单计算器的代码:
```c++
#include <iostream>
#include <stack>
#include <cstring>
using namespace std;
int calculate(string s) {
stack<int> nums; // 存储操作数的栈
stack<char> ops; // 存储操作符的栈
int num = 0, res = 0;
char op = '+';
for (int i = 0; i < s.size(); i++) {
char c = s[i];
if (isdigit(c)) {
num = num * 10 + (c - '0');
}
if (!isdigit(c) && c != ' ' || i == s.size() - 1) {
switch(op) {
case '+': nums.push(num); break;
case '-': nums.push(-num); break;
case '*': res = nums.top() * num; nums.pop(); nums.push(res); break;
case '/': res = nums.top() / num; nums.pop(); nums.push(res); break;
}
num = 0;
if (c == ')') {
while (ops.top() != '(') {
res = nums.top(); nums.pop();
if (ops.top() == '+') res += nums.top();
else res = nums.top() - res;
ops.pop(); nums.pop();
nums.push(res);
}
ops.pop(); // 弹出左括号
} else if (c == '+' || c == '-' || c == '*' || c == '/') {
while (!ops.empty() && ops.top() != '(' &&
((c == '*' || c == '/') ||
(c == '+' || c == '-') && (ops.top() == '+' || ops.top() == '-'))) {
res = nums.top(); nums.pop();
if (ops.top() == '+') res += nums.top();
else res = nums.top() - res;
ops.pop(); nums.pop();
nums.push(res);
}
ops.push(c);
} else if (c == '(') {
ops.push(c);
}
}
}
while (!ops.empty()) {
res = nums.top(); nums.pop();
if (ops.top() == '+') res += nums.top();
else res = nums.top() - res;
ops.pop(); nums.pop();
nums.push(res);
}
return nums.top();
}
int main() {
string s = "10 + (2 - 3) * 4 / 2"; // 测试表达式
cout << calculate(s) << endl; // 输出结果
return 0;
}
```
此代码使用两个栈来存储操作数和操作符。在遍历表达式的过程中,会分别处理常数、操作符以及括号。该计算器实现的四则运算包括加、减、乘、除(仅支持非负整数除法),并且能够处理带有括号的表达式。
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![cpp](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)