第三章 栈
栈{栈、共享栈、链栈、栈的应用}
【一】栈
只允许一端进行插入或删除操作的线性表(此处的线性表指的是顺序表)。
向栈中插入元素称为入栈,从栈中删除元素称为出栈
入栈:
1. 指针 + 1
2. 赋值(存入数据)
出栈:
1. 赋值(取出数据)
2. 指针 - 1
上溢:当栈满时,再做进栈运算产生空间溢出现象
下溢:当栈空时,作退栈运算产生的溢出现象
▷共享栈
共享栈(双栈)[顺序存储]
:两个栈共同开辟一个存储空间,让一个栈的栈底为该空间的始端,另一栈的栈底为该空间的末端,当元素进栈时,都从两端向中间延伸,这样能够使剩余的空间为任意一个栈使用。
栈空
▷链栈
栈的Top代表的是下标;链栈的Top代表的是指针
▷顺序栈和链栈的比较
- 时间性能比价:顺序栈和链栈基本操作的算法,时间复杂度均为O(1)
- 空间性能比较:
初始时顺序栈
必须确定一个固定的长度,所以有存储元素个数和空间的浪费问题。
链栈无栈满问题
,只有当内存没有可用空间时才会出现栈满,但是每一个元素都是需要一个指针域,从而产生了结构性开销
一般结论:
当栈在使用过程中元素的个数变化较大时,用链栈比较好,反之,应该采用顺序栈。
经典例题
:和顺序栈相比,链栈有一个比较明显的优势是(A)
A.通常不会出现栈满的情况
B.通常不会出现栈空的情况
C.插入操作更容易实现
D.删除操作更容易实现
▷栈的应用:主要在括号匹配、表达式求值、递归
前缀表达式和后缀表达式
——步骤:①加括号(从左往右,按优先级加) ②移符号{改后缀就往后启动,改前缀就往前面移动} ③去括号
【二】队列———先进先出
队列{队列、循环队列、双端队列(输出受限、输入受限、不受限)、链队、队的应用}
只允许在表的一端进行插入,而在另一端进行删除。
向队列中插入元素称为入队
,从队列里删除元素称为出队
简单队列可能存在假溢出或假满的问题
▷循环队列_考得最多
满队状态头指针和尾指针不会在一起
算循环队列里元素个数:(尾-头+表长)%表长,这个%是求余运算
▷双端队列_考得少,但必须掌握
指允许两端都可以进行入队和出队操作的队列(不受限)
输出受限
的双端队列:允许在一端进行插入和删除,在另一端只允许插入的双端队列称为输出受限的双端队列
输入受限
的双端队列:允许在一端进行插入和删除,但在另一端只允许删除的双端队列称为输入受限的双端队列
▷链队
实际上是一个同时带有队头指针和队尾指针的单链表