不使用栈做一个复杂的四则混合运算的计算器
时间: 2024-03-03 17:53:27 浏览: 124
不使用栈实现四则混合运算计算器需要使用其他的数据结构来存储表达式和中间结果,下面介绍一种常见的算法——逆波兰表达式。
逆波兰表达式又称后缀表达式,其特点是运算符位于操作数的后面,因此不需要括号来区分运算顺序,计算时只需要顺序遍历表达式并按照运算符的顺序计算即可。
实现逆波兰表达式的步骤如下:
1. 定义一个栈来存储中间结果,可以使用数组或链表来实现。
2. 读入待计算的表达式,遇到数字直接输出,遇到运算符则与栈顶元素进行比较,如果栈顶元素优先级比当前运算符高,则将栈顶元素弹出并输出,直到栈顶元素优先级比当前运算符低或相等为止,然后将当前运算符入栈。
3. 遇到左括号直接入栈,遇到右括号则将栈中元素弹出并输出,直到遇到左括号为止,左括号也要被弹出。
4. 最后将栈中剩余的元素弹出并输出,得到逆波兰表达式。
5. 顺序遍历逆波兰表达式,遇到数字则入栈,遇到运算符则弹出栈顶的两个元素进行运算,将结果入栈,直到遍历完整个表达式,栈中剩余的元素就是最终的计算结果。
下面是一个示例代码(使用数组实现栈):
```
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 100; // 栈的最大容量
int stk[MAXN], top = -1; // 定义栈和栈顶指针
// 判断运算符优先级,返回1表示栈顶元素优先级高,返回0表示相等或低
int priority(char ch) {
if (ch == '+' || ch == '-') return 1;
if (ch == '*' || ch == '/') return 2;
return 0;
}
// 将中缀表达式转换为逆波兰表达式
void to_postfix(char infix[], char postfix[]) {
int len = strlen(infix), j = 0;
for (int i = 0; i < len; i++) {
if (infix[i] >= '0' && infix[i] <= '9') { // 数字直接输出
while (infix[i] >= '0' && infix[i] <= '9') {
postfix[j++] = infix[i++];
}
postfix[j++] = ' '; // 用空格分隔数字
i--;
} else if (infix[i] == '(') { // 左括号直接入栈
stk[++top] = infix[i];
} else if (infix[i] == ')') { // 右括号弹出栈中元素并输出
while (top > 0 && stk[top] != '(') {
postfix[j++] = stk[top--];
postfix[j++] = ' ';
}
top--; // 弹出左括号
} else { // 运算符比较优先级
while (top > 0 && priority(stk[top]) >= priority(infix[i])) {
postfix[j++] = stk[top--];
postfix[j++] = ' ';
}
stk[++top] = infix[i]; // 当前运算符入栈
}
}
while (top > 0) { // 栈中剩余元素输出
postfix[j++] = stk[top--];
postfix[j++] = ' ';
}
postfix[j] = '\0'; // 结尾加上空字符
}
// 计算逆波兰表达式
int calculate(char postfix[]) {
int len = strlen(postfix), j = 0;
int stk[MAXN], top = -1; // 定义栈和栈顶指针
for (int i = 0; i < len; i++) {
if (postfix[i] >= '0' && postfix[i] <= '9') { // 数字入栈
int num = 0;
while (postfix[i] >= '0' && postfix[i] <= '9') {
num = num * 10 + postfix[i] - '0';
i++;
}
stk[++top] = num;
} else if (postfix[i] == '+') { // 加法
int b = stk[top--];
int a = stk[top--];
stk[++top] = a + b;
} else if (postfix[i] == '-') { // 减法
int b = stk[top--];
int a = stk[top--];
stk[++top] = a - b;
} else if (postfix[i] == '*') { // 乘法
int b = stk[top--];
int a = stk[top--];
stk[++top] = a * b;
} else if (postfix[i] == '/') { // 除法
int b = stk[top--];
int a = stk[top--];
stk[++top] = a / b;
}
}
return stk[0]; // 返回计算结果
}
int main() {
char infix[MAXN], postfix[MAXN]; // 定义中缀表达式和逆波兰表达式
cin >> infix;
to_postfix(infix, postfix);
cout << postfix << endl; // 输出逆波兰表达式
cout << calculate(postfix) << endl; // 输出计算结果
return 0;
}
```
注意:本程序只支持整数的四则混合运算,不支持负数、小数、括号内的特殊运算等情况,仅供参考。
阅读全文