用C语言实现实现栈的应用表达式求值 采用顺序栈实现表达式求值 从运行界面输入一个表达式 该表达式包括加法 减法 乘法 除法 括号
时间: 2024-02-27 10:54:36 浏览: 79
数据结构课程设计-用栈实现表达式求值的方法详解
好的,我会尽力回答您的问题。
首先,我们需要了解一下逆波兰表达式。逆波兰表达式是一种无需括号即可表示算术表达式的方法,它将运算符放在操作数的后面,因此也被称为后缀表达式。例如,中缀表达式 3 + 4 * 5 可以转换为后缀表达式 3 4 5 * +。
使用逆波兰表达式求值的算法如下:
1. 从左到右遍历表达式,如果遇到数字则入栈。
2. 如果遇到运算符,则弹出栈顶的两个数字,进行运算,并将结果入栈。
3. 最终栈中只剩下一个数字,即为表达式的值。
接下来,我们来看看如何用顺序栈实现逆波兰表达式求值。
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_SIZE 100
typedef struct {
int data[MAX_SIZE];
int top;
} Stack;
void init(Stack *s) {
s->top = -1;
}
int is_empty(Stack *s) {
return s->top == -1;
}
int is_full(Stack *s) {
return s->top == MAX_SIZE - 1;
}
void push(Stack *s, int x) {
if (is_full(s)) {
printf("Stack is full.\n");
exit(EXIT_FAILURE);
}
s->data[++s->top] = x;
}
int pop(Stack *s) {
if (is_empty(s)) {
printf("Stack is empty.\n");
exit(EXIT_FAILURE);
}
return s->data[s->top--];
}
int peek(Stack *s) {
if (is_empty(s)) {
printf("Stack is empty.\n");
exit(EXIT_FAILURE);
}
return s->data[s->top];
}
int eval(char *expr) {
Stack s;
init(&s);
int i = 0;
while (expr[i]) {
if (isdigit(expr[i])) {
int num = 0;
while (isdigit(expr[i])) {
num = num * 10 + (expr[i] - '0');
i++;
}
push(&s, num);
} else if (expr[i] == '+' || expr[i] == '-' || expr[i] == '*' || expr[i] == '/') {
int b = pop(&s);
int a = pop(&s);
int c;
switch (expr[i]) {
case '+': c = a + b; break;
case '-': c = a - b; break;
case '*': c = a * b; break;
case '/': c = a / b; break;
}
push(&s, c);
i++;
} else if (expr[i] == ' ') {
i++;
} else {
printf("Invalid input.\n");
exit(EXIT_FAILURE);
}
}
int result = pop(&s);
if (!is_empty(&s)) {
printf("Invalid input.\n");
exit(EXIT_FAILURE);
}
return result;
}
int main() {
char expr[MAX_SIZE];
printf("Enter an expression: ");
fgets(expr, MAX_SIZE, stdin);
int result = eval(expr);
printf("Result: %d\n", result);
return 0;
}
```
在这个程序中,我们定义了一个 Stack 结构体,并实现了初始化、判断栈是否为空/满、入栈、出栈、查看栈顶元素等操作。
在 eval 函数中,我们遍历输入的表达式,如果遇到数字则入栈,如果遇到运算符则弹出栈顶的两个数字进行运算,并将结果入栈。最终,栈中只剩下一个数字,即为表达式的值。
在主函数中,我们通过 fgets 函数从标准输入中读取表达式,并调用 eval 函数求值,最终输出结果。
注意:本程序没有处理负数和浮点数。如果需要支持这些情况,需要对代码进行修改。
阅读全文