写一段程序,用栈实现四则运算
时间: 2024-10-17 18:03:48 浏览: 25
当然,我们可以使用栈来实现四则运算(加减乘除)的逆波兰表达式求值。逆波兰表示法也称为后缀表示法,它不使用括号,而是通过元素顺序来确定操作的优先级。以下是一个简单的C语言示例,它定义了一个栈结构并实现了四则运算:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct {
int data[MAX_SIZE];
int top;
} Stack;
// 初始化栈
void init(Stack *s) {
s->top = -1;
}
// 判断栈是否为空
int isEmpty(Stack *s) {
return (s->top == -1);
}
// 把数据压入栈
void push(Stack *s, int val) {
if (isEmpty(s)) {
s->data[++s->top] = val;
}
}
// 弹出栈顶元素
int pop(Stack *s) {
if (!isEmpty(s)) {
return s->data[s->top--];
} else {
printf("Error: Stack is empty.\n");
exit(1);
}
}
// 求逆波兰表达式的值
double evaluatePostfix(char *tokens) {
Stack s;
double num1, num2, result;
char *token;
init(&s);
// 遍历字符串中的每个字符
for (token = tokens; *token != '\0'; ++token) {
// 如果遇到数字,先将其转换为double并压入栈
if (*token >= '0' && *token <= '9') {
num1 = 0;
while (*token >= '0' && *token <= '9') {
num1 = num1 * 10 + *token - '0';
token++;
}
push(&s, num1);
}
// 否则,弹出两个数进行运算,根据当前字符获取操作符
else {
num2 = pop(&s);
switch (*token) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
if (num2 != 0)
result = num1 / num2;
else {
printf("Error: Division by zero.\n");
exit(1);
}
break;
default:
printf("Invalid operator.\n");
exit(1);
}
push(&s, result);
}
}
// 最后的结果在栈顶
return pop(&s);
}
int main() {
char* expr = "2 3 + 4 *";
printf("Result of %s: %.2f\n", expr, evaluatePostfix(expr));
return 0;
}
```
在这个程序中,我们首先初始化一个栈,然后遍历给定的逆波兰表达式,处理数字和操作符。对于数字,我们将它们压入栈;对于操作符,我们从栈中弹出两个数执行相应的运算并将结果压回栈。最后,栈顶的元素就是计算的结果。
阅读全文