试设计一个算术四则运算表达式求值的简单计算器。 基本要求: 1、 操作数均为非负整数常数,操作符仅为+、-、*、/、、; 2、 编写 main 函数进行测试
时间: 2023-10-20 17:16:47 浏览: 94
ChitGPT: 您好!感谢您使用ChitGPT进行对话。关于您的问题,我可以为您提供一个简单的算术四则运算表达式求值的计算器的设计。以下是一个示例代码:
```c++
#include <iostream>
#include <stack>
using namespace std;
int main()
{
stack<int> num_stack; // 存放操作数的栈
stack<char> oper_stack; // 存放操作符的栈
char c; // 用于读入字符
int num = 0; // 存放当前正在读入的操作数
bool flag = false; // 标记当前是否正在读入操作数
while (cin >> c) {
if (isdigit(c)) { // 如果当前字符是数字
if (flag) { // 如果上一个字符也是数字,说明当前数字有多位
num = num * 10 + c - '0'; // 继续读入数字
}
else {
num = c - '0'; // 开始读入新的操作数
}
flag = true; // 标记当前在读入操作数
}
else { // 如果当前字符是操作符
flag = false; // 标记当前不在读入操作数
num_stack.push(num); // 将上一个操作数入栈
num = 0; // 清空当前操作数
switch (c) {
case '+':
case '-':
// 将所有优先级更高或相等的操作符出栈,直到遇到左括号或栈空
while (!oper_stack.empty() && oper_stack.top() != '(') {
int b = num_stack.top();
num_stack.pop();
int a = num_stack.top();
num_stack.pop();
char op = oper_stack.top();
oper_stack.pop();
if (op == '+') {
num_stack.push(a + b);
}
else { // op == '-'
num_stack.push(a - b);
}
}
// 当前操作符入栈
oper_stack.push(c);
break;
case '*':
case '/':
// 将所有优先级更高或相等的操作符出栈,直到遇到左括号、+或-,或栈空
while (!oper_stack.empty() && oper_stack.top() != '(' && oper_stack.top() != '+' && oper_stack.top() != '-') {
int b = num_stack.top();
num_stack.pop();
int a = num_stack.top();
num_stack.pop();
char op = oper_stack.top();
oper_stack.pop();
if (op == '*') {
num_stack.push(a * b);
}
else { // op == '/'
num_stack.push(a / b);
}
}
// 当前操作符入栈
oper_stack.push(c);
break;
case '(':
// 直接入栈
oper_stack.push(c);
break;
case ')':
// 将所有优先级更高或相等的操作符出栈,直到遇到左括号或栈空
while (!oper_stack.empty() && oper_stack.top() != '(') {
int b = num_stack.top();
num_stack.pop();
int a = num_stack.top();
num_stack.pop();
char op = oper_stack.top();
oper_stack.pop();
if (op == '+') {
num_stack.push(a + b);
}
else if (op == '-') {
num_stack.push(a - b);
}
else if (op == '*') {
num_stack.push(a * b);
}
else { // op == '/'
num_stack.push(a / b);
}
}
// 弹出左括号
oper_stack.pop();
break;
default:
cout << "非法操作符!" << endl;
return 0;
}
}
}
// 将最后一个操作数入栈
num_stack.push(num);
// 将剩余的操作符全部出栈计算
while (!oper_stack.empty()) {
int b = num_stack.top();
num_stack.pop();
int a = num_stack.top();
num_stack.pop();
char op = oper_stack.top();
oper_stack.pop();
if (op == '+') {
num_stack.push(a + b);
}
else if (op == '-') {
num_stack.push(a - b);
}
else if (op == '*') {
num_stack.push(a * b);
}
else { // op == '/'
num_stack.push(a / b);
}
}
// 栈中最后剩余的元素即为最终结果
cout << num_stack.top() << endl;
return 0;
}
```
以上是一个简单的算术四则运算表达式求值的计算器的设计。请注意,该实现并没有考虑所有可能的情况,如输入表达式不合法、输入操作数为负数等。如果需要更加完整的功能,建议在此基础上进行进一步的开发。
阅读全文