假定算数表达式的值均为非负整数常数,不包含变量、小 数和字符常量。 试设计一个算术四则运算表达式求值的简单计算器。 基本要求: 1、 操作数均为非负整数常数,操作符仅为+、-、*、/、(、); 2、 编写 main 函数进行测试
时间: 2023-11-08 20:59:47 浏览: 52
简单的四则运算的计算器
ChitGPT: 您好!我可以回答您的问题,关于您所提到的算术四则运算表达式求值的计算器,我可以给您提供一种简单的 C++ 实现方法,如下所示:
```
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int priority(char op) {//优先级函数,返回操作符的优先级
if (op == '(' || op == ')') return 0;//最低优先级
if (op == '+' || op == '-') return 1;//次高优先级
if (op == '*' || op == '/') return 2;//最高优先级
return -1;//无效操作符,返回-1
}
int calc(char op, int b, int a) {//计算函数,返回计算结果
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
default: return 0;//无效操作符
}
}
int evaluate(string expr) {//表达式求值函数,返回计算结果
stack<char> ops;//操作符栈
stack<int> vals;//操作数栈
for (int i = 0; i < expr.length(); i++) {
if (expr[i] >= '0' && expr[i] <= '9') {//如果是数字,转换为整数并入操作数栈
int val = 0;
while (i < expr.length() && expr[i] >= '0' && expr[i] <= '9') {
val = val * 10 + (expr[i] - '0');
i++;
}
vals.push(val);
i--;//调整i的位置
}
else {//如果是操作符
if (ops.empty() || expr[i] == '(' || priority(expr[i]) > priority(ops.top())) {
ops.push(expr[i]);//如果优先级高于栈顶操作符,或者栈为空,入操作符栈
}
else {
while (!ops.empty() && priority(expr[i]) <= priority(ops.top())) {
int b = vals.top(); vals.pop();//弹出操作数栈的栈顶元素,作为右操作数
int a = vals.top(); vals.pop();//弹出操作数栈的栈顶元素,作为左操作数
char op = ops.top(); ops.pop();//弹出操作符栈的栈顶元素,作为操作符
vals.push(calc(op, b, a));//计算结果压入操作数栈
}
if (expr[i] != ')')//如果当前操作符不是右括号, 入操作符栈
ops.push(expr[i]);
else
ops.pop();//如果是右括号,弹出左括号
}
}
}
while (!ops.empty()) {//处理操作符栈中的剩余操作符
int b = vals.top(); vals.pop();
int a = vals.top(); vals.pop();
char op = ops.top(); ops.pop();
vals.push(calc(op, b, a));
}
return vals.top();//返回操作数栈中的唯一元素,即计算结果
}
int main() {//主函数
string expr = "";//存放算数表达式
cout << "请输入算数表达式:";
cin >> expr;
cout << "结果是:" << evaluate(expr) << endl;
return 0;
}
```
请注意,这只是一种简单实现方法,还有很多优化空间。同时,这个计算器只能处理非负整数的四则运算,如果要处理更复杂的表达式,就需要进行扩展和改进。
请问还有其他什么问题吗?
阅读全文