四、栈

特点

  • 先进后出
  • 操作受限的线性表
  • 只涉及在一端插入和删除数据
  • 可以用数组,也可以用链表实现
  • 数组实现的栈叫顺序栈
  • 链表实现的栈叫链式栈

动态扩容的顺序栈

  • 顺序栈支持动态扩容:当数组内存不够时,申请一块更大的内存,将原来数组中的数据拷贝过去
  • 不常用
image.png

栈在函数调用中的应用(函数调用栈)

  • 系统给每一个线程都会分配一块独立的内存空间,这块空间被组织成栈,,用来存储函数调用的临时变量
  • 每进入一个函数,会把临时变量作为一个栈帧入栈,当被调用的函数执行完成,返回之后,这个函数对应的栈帧出栈
  • 栈帧:栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。简言之,栈帧就是利用EBP(栈帧指针,请注意不是ESP)寄存器访问局部变量、参数、函数返回地址等的手段。
  • 每个函数都是一个独立的栈帧
  • 独立的栈帧包含:函数的返回地址和参数,临时变量,函数调用的上下文
int main() {
   int a = 1; 
   int ret = 0;
   int res = 0;
   ret = add(3, 5);
   res = a + ret;
   printf("%d", res);
   reuturn 0;
}
int add(int x, int y) {
   int sum = 0;
   sum = x + y;
   return sum;
}
image.png

栈在表达式求值中的应用

  • 编译器通过两个栈实现
  • 一个栈保存操作数
  • 一个栈保存运算符
  • 从左到右遍历,遇到数字入操作数栈,遇到运算符,先与运算符栈的栈顶元素进行比较
  • 如果比运算符栈顶元素的优先级高,当前运算符就入栈,
  • 如果比运算符栈顶元素的优先级低或相等,运算符栈顶元素出栈,从操作数栈栈顶取出两个操作数计算,再把计算结果压入操作数栈,继续比较
image.png

栈在括号匹配中的应用

如:{[] ()[{}]}或[{()}([])]

从左到右扫描字符串,如果 栈是空的,压入,扫描第二个字符串,然后和栈顶元素对比,如果是对应的另一半,则栈顶的元素出栈,否则入栈,最后字符串扫描完之后,检查栈是否为空,如果为空就是合法的括号,否则不合法

  • 从左到右扫描字符串
  • 栈空,压入字符串,继续扫描字符串
  • 拿下一个元素和栈顶元素比较,如果是对应的另一半,栈顶元素出栈,否则压栈
  • 字符串扫描完毕之后,检查栈,如果为空,字符串合法,否则不合法
image

你可能感兴趣的:(四、栈)