试设计一个算术四则运算表达式求值的简单计算器。 基本要求: 1、 操作数均为非负整数常数,操作符仅为+、-、*、/、、; 2、 编写 main 函数进行测试
时间: 2023-10-20 12:20:42 浏览: 109
好的,让我来回答您的问题。
以下是一个简单的算术四则运算表达式求值计算器的设计及测试代码:
```
#include <iostream>
#include <string>
#include <stack>
using namespace std;
bool is_operator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
// 计算运算符的优先级
int priority(char op) {
switch(op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '(':
case ')':
return 0;
default:
return -1; // 表示错误
}
}
// 计算两个数的结果
int caculate(int a, int b, char op) {
int result = 0;
switch(op) {
case '+':
result = a + b;
break;
case '-':
result = a - b;
break;
case '*':
result = a * b;
break;
case '/':
result = a / b;
break;
}
return result;
}
// 转换表达式,将中缀表达式转换成后缀表达式
string trans(string exp) {
stack<char> s;
string result;
for (int i = 0; i < exp.size(); i++) {
char c = exp[i];
if (isdigit(c)) { // 如果是数字
result += c; // 直接输出
} else if (c == '(') { // 如果是左括号
s.push(c); // 将其入栈
} else if (c == ')') { // 如果是右括号
while (!s.empty() && s.top() != '(') {
result += s.top();
s.pop();
}
s.pop(); // 将左括号从栈中弹出
} else { // 如果是运算符
while (!s.empty() && priority(c) <= priority(s.top())) {
result += s.top(); // 输出优先级较高的运算符
s.pop(); // 将其从栈中弹出
}
s.push(c); // 最后将当前运算符入栈
}
}
while (!s.empty()) { // 最后将栈中的元素全部弹出
result += s.top();
s.pop();
}
return result;
}
// 计算后缀表达式的结果
int evaluate(string exp) {
stack<int> s;
for (int i = 0; i < exp.size(); i++) {
char c = exp[i];
if (isdigit(c)) { // 如果是数字
s.push(c - '0'); // 将其入栈
} else if (is_operator(c)) { // 如果是运算符
int b = s.top(); // 弹出栈顶元素作为第二个运算数
s.pop();
int a = s.top(); // 弹出栈顶元素作为第一个运算数
s.pop();
int result = caculate(a, b, c); // 计算两个数的结果
s.push(result); // 将结果入栈
}
}
return s.top(); // 最终栈中只剩下一个元素,即为最终的结果
}
int main() {
string expression = "1 + 2 * (4 - 3) / 2";
string postfix_expression = trans(expression); // 将中缀表达式转换成后缀表达式
int result = evaluate(postfix_expression); // 计算后缀表达式的结果
cout << expression << " = " << result;
return 0;
}
```
这是一个比较基础的计算器,只能处理最简单的四则运算表达式,并且不支持负数和小数。但是它足以满足本题的要求。
希望对您有所帮助,如果您有其他问题,欢迎随时提出。
阅读全文