编写一个程序实现顺序栈的各种基本运算。实现后缀表达式运算C语言
时间: 2024-10-28 18:09:26 浏览: 13
在C语言中,我们可以编写一个简单的程序来实现顺序栈的基本操作,包括入栈(push)、出栈(pop)、查看栈顶元素(top)以及判断栈是否为空(is_empty)。同时,我们也可以设计一个函数用于处理后缀表达式(也称为逆波兰表达式),并计算其结果。
首先,我们需要定义一个结构体表示栈,包含一个整型数组作为存储元素的容器,以及一个整数变量作为栈顶指针:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct {
int items[MAX_SIZE];
int top;
} Stack;
// 初始化栈
void init(Stack* s) {
s->top = -1;
}
// 判断栈是否为空
int is_empty(Stack* s) {
return s->top == -1;
}
// 入栈
void push(Stack* s, int item) {
if (s->top < MAX_SIZE - 1) {
s->items[++s->top] = item;
} else {
printf("Stack overflow.\n");
}
}
// 出栈并返回顶部元素
int pop(Stack* s) {
if (!is_empty(s)) {
return s->items[s->top--];
} else {
printf("Stack underflow.\n");
return -1;
}
}
// 查看栈顶元素(不删除)
int peek(Stack* s) {
if (!is_empty(s)) {
return s-1;
}
}
```
对于后缀表达式的计算,你可以设计一个函数`evaluate_postfix(expression)`,接受一个后缀表达式的字符串,利用栈来逐个处理数字和运算符,直到处理完整个表达式:
```c
double evaluate_postfix(const char* expression) {
Stack stack;
init(&stack);
for (char* token = strtok(expression, " ");
token != NULL;
token = strtok(NULL, " ")) {
// 如果是数字,直接入栈
if (isdigit(*token)) {
push(&stack, atoi(token));
// 如果是运算符,弹出两个操作数并计算结果
} else {
double operand2 = pop(&stack);
double operand1 = pop(&stack);
switch (*token) {
case '+':
push(&stack, operand1 + operand2);
break;
case '-':
push(&stack, operand1 - operand2);
break;
case '*':
push(&stack, operand1 * operand2);
break;
case '/':
if (operand2 != 0)
push(&stack, operand1 / operand2);
else
printf("Division by zero error.\n");
break;
default:
printf("Invalid operator.\n");
return -1;
}
}
}
// 检查是否有剩余的操作数
if (!is_empty(&stack)) {
printf("Invalid expression.\n");
return -1;
}
return pop(&stack);
}
int main() {
const char* expr = "2 3 + 4 *";
printf("Result: %.2f\n", evaluate_postfix(expr));
return 0;
}
```
阅读全文