用C语言建立顺序栈,实现入栈、出栈、获取栈顶元素操作,并利用顺序栈实现表达式的求解
时间: 2024-04-30 16:19:01 浏览: 137
用c语言来实现顺序栈
5星 · 资源好评率100%
好的,以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义栈结构体
typedef struct {
int *data; // 存储数据的数组
int top; // 栈顶指针
int size; // 栈的大小
} SeqStack;
// 初始化栈
void initStack(SeqStack *stack, int size) {
stack->data = (int *)malloc(sizeof(int) * size);
stack->top = -1;
stack->size = size;
}
// 判断栈是否为空
int isEmpty(SeqStack *stack) {
return stack->top == -1;
}
// 判断栈是否已满
int isFull(SeqStack *stack) {
return stack->top == stack->size - 1;
}
// 入栈
int push(SeqStack *stack, int value) {
if (isFull(stack)) {
return 0;
}
stack->top++;
stack->data[stack->top] = value;
return 1;
}
// 出栈
int pop(SeqStack *stack, int *value) {
if (isEmpty(stack)) {
return 0;
}
*value = stack->data[stack->top];
stack->top--;
return 1;
}
// 获取栈顶元素
int getTop(SeqStack *stack, int *value) {
if (isEmpty(stack)) {
return 0;
}
*value = stack->data[stack->top];
return 1;
}
// 表达式求解
int calc(char *expr) {
SeqStack stack;
initStack(&stack, 100); // 假设表达式最大长度为100
int i = 0;
while (expr[i] != '\0') {
if (expr[i] >= '0' && expr[i] <= '9') {
// 如果是数字,将其入栈
push(&stack, expr[i] - '0');
} else {
// 如果是运算符,从栈中取出两个数进行运算
int left, right, result;
pop(&stack, &right);
pop(&stack, &left);
switch (expr[i]) {
case '+':
result = left + right;
break;
case '-':
result = left - right;
break;
case '*':
result = left * right;
break;
case '/':
result = left / right;
break;
default:
printf("Invalid expression\n");
return 0;
}
push(&stack, result);
}
i++;
}
int value;
pop(&stack, &value);
return value;
}
int main() {
char expr[] = "23+4*5-";
int result = calc(expr);
printf("%d\n", result); // 输出: 13
return 0;
}
```
解释一下代码实现:
首先定义了一个结构体 `SeqStack`,包含三个成员变量:
- `data`:存储数据的数组
- `top`:栈顶指针,指向最后一个入栈的元素
- `size`:栈的大小
接着定义了一些栈的基本操作:
- `initStack`:初始化栈
- `isEmpty`:判断栈是否为空
- `isFull`:判断栈是否已满
- `push`:入栈
- `pop`:出栈
- `getTop`:获取栈顶元素
最后,定义了一个函数 `calc`,用于表达式求解。它首先创建了一个栈,然后遍历表达式的每个字符:
- 如果是数字,将其入栈
- 如果是运算符,从栈中取出两个数进行运算,然后将结果入栈
经过遍历后,最后栈中只剩下一个元素,即表达式的计算结果。
最后在 `main` 函数中调用 `calc` 函数进行测试。
阅读全文