ch3栈和队列

cover

学不会的时候,只要微笑就好了

上一单元总结链接:ch2线性表总结

一、栈:

栈是一种只能在一端进行插入或删除操作的线性表。

栈只能选取同一个端点进行插入和删除操作

定义:

允许进行插入、删除操作的一端称为栈顶

表的另一端称为栈底

当栈中没有数据元素时,称为空栈

栈的插入操作通常称为进栈入栈

栈的删除操作通常称为退栈出栈

由于栈中元素之间的逻辑关系与线性表相同,所以可以采用和线性表相同的存储结构

【问】栈和堆有什么区别:参考解释

  • 1.1——顺序栈

a

两栈共享:

b

从两端同时开始操作

  • 1.2——链栈

首先明确:该方案采用的是头插法,判空机制是利用top->next是否为空指针。

c

将多个链栈的栈顶指针放在一个一维数组里来统一管理,从而实现管理和使用多个栈,叫做多栈运算,而哈希表就是其经典使用案例。

栈的应用举例:☺表达式求值:无括号算术表达式求值(详情可以看一下我的另一篇转载内容

  • 1.3 栈与递归的实现:

递归就像套娃,经过层层调用到最底层的数值,再利用他一层层回来求更复杂的值;比如斐波那契数列就是一个典型的有递归特性的数列。

教材上举例用了汉诺塔,但是光给了代码,说明不是很清楚。首先我们看一下四个环时该怎么移动……

hannuo

(来源于网络,侵删)

相信聪明如你肯定幼儿园就已经看破了,那么其实五个环甚至更多的环操作都是一样的:移动n个环,其实只要把最大的——即第n个环先看作底座的一部分不去理会,剩下n-1个环按n-1的方法去移动,最后再考虑多出的第n个环——以此类推,这其实就是不断调用前项的结果的递归算法。

不过既然每次计算都会向前不断自身调用,递归算法的耗时也是异常地感人……

二、队列:

  • 2.1 简单定义:

d

相对于栈单进单出,先进后出;队列一般是先进先出

不过对于队列,元素往往是从尾巴上怼进去的

  • 把进行插入的一端称做队尾(rear)
  • 进行删除的一端称做队首队头(front)
  • 向队列中插入新元素称为进队入队,新元素进队后就成为新的队尾元素。
  • 从队列中删除元素称为出队离队,元素出队后,其后继元素就成为队首元素。
  • 队列具有先进先出 (Fist In Fist Out,缩写为FIFO)的特性

e

2.2 队列的表示与实现:

逻辑关系上仍与线性表相同,故仍可用1、顺序队列2、链队列两种存储结构

循环链表:f

这里通过取模使得下标数值永远不超过最大下标值。