20176408李俊 栈和队列

:限定仅在表尾进行插入和删除操作的线性表。
空栈:不含任何数据元素的栈。
允许插入和删除的一端称为栈顶,另一端称为栈底。

栈的操作特性:后进先出(LIFO)
注意:栈只是对表插入和删除操作的位置进行了限制,并没有限定插入和删除操作进行的时间。

栈中元素具有相同类型及后进先出特性,相邻元素具有前驱和后继关系。

两栈共享空间
在一个程序中需要同时使用具有相同数据类型的两个栈,如何顺序存储这两个栈?
直接解决:为每个栈开辟一个数组空间。
顺序栈单向延伸——使用一个数组来存储两个栈。
两栈共享空间:使用一个数组来存储两个栈,让一个栈的栈底为该数组的始端,另一个栈的栈底为该数组的末端,两个栈从各自的端点向中间延伸。

顺序栈和链栈的比较
时间性能:相同,都是常数时间O(1)。
空间性能:
顺序栈:有元素个数的限制和空间浪费的问题。
链栈:没有栈满的问题,只有当内存没有可用空间时才会出现栈满,但是每个元素都需要一个指针域,从而产生了结构性开销。
总之,当栈的使用过程中元素个数变化较大时,用链栈是适宜的,反之,应该采用顺序栈。

递归的定义
子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的基本方法。
递归的基本思想
问题分解:把一个不能或不好解决的大问题转化为一个或几个小问题,再把这些小问题进一步分解成更小的小问题,直至每个小问题都可以直接解决。
递归的要素
递归边界条件:确定递归到何时终止,也称为递归出口;
递归模式:大问题是如何分解为小问题的,也称为递归体。

递归过程与递归工作栈
递归过程在实现时,需要自己调用自己。
层层向下递归,返回次序正好相反。
递归函数的内部执行过程
⑴ 运行开始时,首先为递归调用建立一个工作栈,其结构包括值参、局部变量和返回地址;
⑵ 每次执行递归调用之前,把递归函数的值参和局部变量的当前值以及调用后的返回地址压栈;
⑶ 每次递归调用结束后,将栈顶元素出栈,使相应的值参和局部变量恢复为调用前的值,然后转向返回地址指定的位置继续执行。

队列的逻辑结构
队列:只允许在一端进行插入操作,而另一端进行删除操作的线性表。
空队列:不含任何数据元素的队列。
允许插入(也称入队、进队)的一端称为队尾,允许删除(也称出队)的一端称为队头。
队列中元素具有相同类型及先进先出特性,相邻元素具有前驱和后继关系!

放宽队列的所有元素必须存储在数组的前n个单元这一条件 ,只要求队列的元素存储在数组中连续的位置。
设置队头、队尾两个指针!

假溢出:当元素被插入到数组中下标最大的位置上之后,队列的空间就用尽了,尽管此时数组的低端还有空闲空间,这种现象叫做假溢出。
循环队列:将存储队列的数组头尾相接。
队列的顺序存储结构及实现
1.附设一个存储队列中元素个数的变量num,当num=0时队空,当num=QueueSize时为队满;
2.修改队满条件,浪费一个元素空间,队满时数组中只有一个空闲单元;
3.设置标志flag,当front=rear且flag=0时为队空,当front=rear且flag=1时为队满。

时间性能:循环队列和链队列的基本操作都需要常数时间O (1)。
空间性能:
循环队列:必须预先确定一个固定的长度,所以有存储元素个数的限制和空间浪费的问题。
链队列:没有队列满的问题,只有当内存没有可用空间时才会出现队列满,但是每个元素都需要一个指针域,从而产生了结构性开销。

发布了11 篇原创文章 · 获赞 1 · 访问量 1221

猜你喜欢

转载自blog.csdn.net/qq_43253170/article/details/84582909