1. 栈的介绍

栈是限制插入和删除只能在一个位置上进行的线性表。 其中,允许插入和删除的一端位于表的末端,叫做栈顶(top),不允许插入和删除的另一端叫做栈底(bottom)。 对栈的基本操作有 PUSH(压栈)POP(出栈),前者相当于表的插入操作(向栈顶插入一个元素),后者则是删除操作(删除一个栈顶元素)。栈是一种 **后进先出(LIFO)**的数据结构,最先被删除的是最近压栈的元素。

1.1 栈实现

由于栈是一个表,因此任何实现表的方法都可以用来实现栈。主要有两种方式,链表实现和数组实现。

1.2 链表实现栈

可以使用单链表来实现栈。通过在表顶端插入一个元素来实现 PUSH,通过删除表顶端元素来实现 POP。使用链表方式实现的栈又叫动态栈。动态栈有链表的部分特性, 即元素与元素之间在屋里存储上可以不连续,但是功能有些受限制,动态栈只能在栈顶处进行插入和删除操作,不能再栈尾或栈中间进行插入和删除操作。

1.3 数组实现栈

栈也可以用数组来实现。使用数组方式实现的栈叫静态栈

2. 栈的应用场景

  • 子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,知道子程序执行完后再将地址取出,以回到原来的程序中。
  • 处理递归调用:和子程序的调用类似,只是除了存储下一个指令的地址外,也将参数、区域变量等数据存储堆栈中。
  • 表达式的转换[中缀表达式转后缀表达式]与求值(实际解决)。
  • 二叉树的遍历。
  • 图的深度优先(depth-first)搜索法。