第四章栈与队列

知识大纲

栈与队列.png

栈和队列的数据结构

相同点

栈和队列都是对删除和插入做了限制的线性表 栈和队列的都是建立在线性表的数据结构上的。因为线性表分顺序存储结构和链式存储结构,所有栈和队列都同时区分这两种数据结构。也就同时拥有了这两种数据结构的优缺点。

不同点

stack栈是限定仅在表尾进行插入和删除操作的线性表。

  • 顺序栈:建立在线性表顺序存储上的栈结构
    当数据类型相同且有相反关系时可以用共享空间解决栈的的空间大小固定的问题。
  • 链式栈:建立在线性表上链式存储的栈结构
    增加了指针域,但是空间大小自由。就是是做每个数据元素的所站的控件增加了,但是链式栈所站的控件是自由的。

队列是只允许在一段进行插入操作,另一段进行删除操作的线性表

  • 顺序队列 : 建立在线性表顺序存储上的队列结构
    不同队列,前面删除元素后后面的所有元素都会移动,时间复杂度为O(n)
    循环队列,当前面的元素被删除后面的元素要溢出的时候,将再增加的元素添加到下标为0的地方。解决了空间浪费和假溢出的问题

  • 链式队列 :建立在线性表链式存储上的队列结构

栈和队列的应用

  • 栈的应用

1,计算机处理四则运算表达式
1.1,将中缀表达式转为后缀表达式
1.2,将后缀表达式进行运算得出结果
将数字和运算符放到了2个栈里面

2,递归
一个直接调用自己或间接调用自己的函数,称为递归。
尾递归(想要了解尾递归需要先了解尾调用)
什么是尾调用?
指某个函数的最后一步是调用另一个函数,尾调用不一定出现在函数尾部,只要是最后一步操作即可。
这个函数只能是一个函数不能再加减乘除任何参数
尾调用优化
函数调用会在内存形成一个"调用记录",又称"调用帧"(call frame),保存调用位置和内部变量等信息。
如果在函数A的内部调用函数B,那么在A的调用记录上方,还会形成一个B的调用记录。等到B运行结束,将结果返回到A,B的调用记录才会消失。如果函数B内部还调用函数C,那就还有一个C的调用记录栈,以此类推。所有的调用记录,就形成一个["调用栈"]。
尾调用由于是函数的最后一步操作,所以不需要保留外层函数的调用记录,因为调用位置、内部变量等信息都不会再用到了,只要直接用内层函数的调用记录,取代外层函数的调用记录就可以了
尾递归
函数调用自身,称为递归。如果尾调用自身,就称为尾递归
递归非常消耗内存
递归非常耗费内存,因为需要同时保存成千上百个调用记录,很容易发生"栈溢出"错误(stack overflow)。但对于尾递归来说,由于只存在一个调用记录,所以永远不会发生"栈溢出"错误

  • 队列的应用
    计算机操作系统
    客服系统

你可能感兴趣的:(第四章栈与队列)