真正理解栈的特点,了解其使用场景,对编程非常有帮助。我们不仅要了解栈是什么,还要思考栈应该用在什么场景。
【栈的特点和几个使用场景】
先入后出,这意味着很多倒序的东西都可以用栈辅助。
函数调用:函数调用就好像我们走在一个多岔路口的马路上,多次转弯之后,如何保证我们原路返回呢?可以在每个转弯处(函数调用处,即,断点)做上记号,以便回来时使用。这其实就是在压栈。
同理,函数中很多表达式是从右到左的执行,也是一样的原理。
编译器检查复杂表达式中的各种括号是否配对,也使用了堆栈。把每个开放的(即,开始的,比如[)符号压栈,之后,看到关闭的符号(比如])就尝试出栈(开放的)并check是否和现在的符号(关闭的)是否匹配。
单链表的反转,你是否可以想到用栈实现呢?
【单链表反转】
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "slist.h"
#include "../stack_queue/stack.h"
/* 用户数据 */
typedef struct node_t_ {
slist_entry_t link;
int val;
} node_t;
/* 链表遍历显示 */
void slist_show(slist_t *list)
{
node_t *item = NULL;
// check