一、什么是栈?
First Out,LIFO),类似于我们平时使用的弹夹,先装进去的子弹才会被射出来。栈可以用数组或链表来实现。
二、栈的实现
1.数组实现
数组实现栈比较简单,我们只需要定义一个数组和一个指向栈顶的变量即可。栈顶变量初始值为-1,当有元素入栈时,栈顶变量加1;当有元素出栈时,栈顶变量减1。
下面是一个简单的数组实现栈的代码
e MX_SIZE 100
typedef struct Stack {t data[MX_SIZE];t top;
} Stack;
t x) {
if (s->top == MX_SIZE - 1) {tf");;
}
s->data[++(s->top)] = x;
t pop(Stack s) {
if (s->top == -1) {tfderflow"); -1;
} s->data[(s->top)--];
2.链表实现
链表实现栈也比较简单,我们只需要定义一个链表节点和一个指向栈顶的指针即可。当有元素入栈时,我们新建一个节点插入链表头部,并将栈顶指针指向该节点;当有元素出栈时,我们删除链表头部节点,并将栈顶指针指向下一个节点。
下面是一个简单的链表实现栈的代码
typedef struct Node {t data;ext;
} Node;
typedef struct Stack {
Node top;
} Stack;
t x) {ewodealloc(sizeof(Node));ewode->data = x;ewodeext = s->top;ewode;
t pop(Stack s) {
if (s->top == NULL) {tfderflow"); -1;
}t data = s->top->data;p = s->top;ext;p); data;
三、栈的应用场景
1.表达式求值
我们可以使用栈来实现表达式求值。具体实现方法是,将中缀表达式转换为后缀表达式,然后用栈来计算后缀表达式的值。例如,中缀表达式“3+54-2”,转换为后缀表达式为“3 5 4 + 2 -”,用栈计算后缀表达式的值即可。
2.括号匹配
我们可以使用栈来判断括号是否匹配。具体实现方法是,遍历字符串,遇到左括号就入栈,遇到右括号就判断栈顶元素是否为对应的左括号,如果是,则出栈,否则括号不匹配。
3.函数调用
函数调用时,系统会将函数的返回地址、参数等信息压入栈中,函数执行完毕后再从栈中弹出这些信息,返回到调用函数的位置。
本文详细讲解了栈的实现方法和应用场景。栈是一种常用的数据结构,可以用于表达式求值、括号匹配、函数调用等场景。我们可以根据具体的应用场景来选择数组实现栈还是链表实现栈。