1
0
mirror of https://github.com/Didnelpsun/CS408.git synced 2026-06-18 09:27:23 +08:00

更新栈

This commit is contained in:
Didnelpsun
2021-09-16 16:48:37 +08:00
parent b1998ca91c
commit 74939da6df
46 changed files with 875 additions and 2438 deletions

View File

@@ -0,0 +1,45 @@
# 栈习题
## 概念
**例题** 栈和队列具有相同的()。
$A.$抽象数据类型
$B.$逻辑结构
$C.$存储结构
$D.$运算
解:$B$。栈和队列的逻辑结构都是相同的,都属于线性结构,只是它们对数据的运算不同。
## 结构选择
**例题** 设链表不带头结点且所有操作均在表头进行,则下列最不适合作为链栈的是()。
$A.$只有表头结点指针,没有表尾指针的双向循环链表
$B.$只有表尾结点指针,没有表头指针的双向循环链表
$C.$只有表头结点指针,没有表尾指针的单向循环链表
$D.$只有表尾结点指针,没有表头指针的单向循环链表
解:$C$。对于双向循环链表,不管是表头指针还是表尾指针,都可以很方便地找到表头结点,方便在表头做插入或删除操作。而单循环链表通过尾指针的$next$指针可以很方便地找到表头结点,但通过头指针指向的就是头,对于头的操作则需要遍历一次链表到表尾。对于$C$,插入和删除结点后,找尾结点需要花费$O(n)$的时间。
## 出栈排列
如果有$n$个不同的元素进栈,出栈元素不同排列的个数为$\dfrac{1}{n+1}C_{2n}^n=\dfrac{1}{n+1}\dfrac{(2n)!}{n!\times n!}$,这就是卡特兰数。
**例题** $3$个不同元素依次进栈,能得到()种不同的出栈序列。
$A.4$
$B.5$
$C.6$
$D.7$
解:$B$。根据公式可得$\dfrac{6\times5\times4}{4\times3\times2\times1}=5$。

View File

@@ -1,6 +1,6 @@
# 队列
队列是只允许一端进行插入入队一端进行删除出队的线性表。即先进先出FIFO。
队列是只允许一端进行插入(入队或进队),一端进行删除(出队或离队)的线性表。即先进先出$FIFO$
队列允许插入的一端就是队尾,允许删除的一端就是队头。
@@ -16,17 +16,17 @@
解决的方法就是使用模运算将队尾指针不仅仅是加一而是加一后再取整个静态数组大小MAXSIZE的模这样如果队列尾指针超过了范围也仍能回到最开始插入数据。这时候物理结构虽然是线性的而逻辑上已经变成了环型的了。
所以与此同时,队列已满的条件也不再是队尾指针=MAXSIZE了而是队尾指针的下一个指针是队头指针这里最后一个存储单元是不能存储数据的因为如果存储了数据那么头指针就等于尾指针这在我们的定义中是空队列的意思会混淆所以必须牺牲一个存储单元。
所以与此同时,队列已满的条件也不再是队尾指针$=MAXSIZE$了,而是队尾指针的下一个指针是队头指针,这里最后一个存储单元是不能存储数据的,因为如果存储了数据那么头指针就等于尾指针,这在我们的定义中是空队列的意思,会混淆,所以必须牺牲一个存储单元。
如果我们最开始定义时,让队首指针指向-1队尾指针指向0,则可以相等。
如果我们最开始定义时,让队首指针指向$-1$,队尾指针指向$0$,则可以相等。
从而队列元素个数=(rear+MAXSIZE-front)%MAXSIZE。
从而队列元素个数$=(rear+MAXSIZE-front)\%MAXSIZE$
#### 顺序队列删除
当如果我们必须保证所有的存储空间被利用可以定义一个size表明队列当前的长度就可以完全利用所有空间。
当如果我们必须保证所有的存储空间被利用,可以定义一个$size$表明队列当前的长度,就可以完全利用所有空间。
同理我们可以定义一个int类型的tag当进行删除操作就置tag为0插入操作时置tag为1,只有删除才可能队空,只有插入才可能队满,所以就可以根据这个来判断。
同理我们可以定义一个$int$类型的$tag$,当进行删除操作就置$tag$为$0$,插入操作时置$tag$为$1$,只有删除才可能队空,只有插入才可能队满,所以就可以根据这个来判断。
## 链队
@@ -42,4 +42,4 @@
+ 树的层次遍历。
+ 图的广度优先遍历。
+ 进程争用FCFS策略。
+ 进程争用$FCFS$策略。