数据结构与算法

第四章栈与队列

2019-11-03  本文已影响0人  洋之_

知识大纲

栈与队列.png

栈和队列的数据结构

相同点

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

不同点

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

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

栈和队列的应用

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

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

上一篇 下一篇

猜你喜欢

热点阅读