1
0
mirror of https://github.com/Didnelpsun/CS408.git synced 2026-02-11 14:45:57 +08:00

更新数据结构

This commit is contained in:
Didnelpsun
2021-09-15 23:47:38 +08:00
parent 028cf20dde
commit b1998ca91c
13 changed files with 1059 additions and 465 deletions

View File

@@ -1,10 +1,10 @@
# 栈
栈结构与线性表类似是只允许一端表尾进入或删除的线性表。即后进先出LIFO。
栈结构与线性表类似,是只允许一端(表尾)进入或删除的线性表。即后进先出$LIFO$
栈顶就是允许插入和删除的一端,而另一端就是栈底。
进栈顺序:A->B->C->D出栈顺序D->C->B->A
进栈顺序:$A\rightarrow B\rightarrow C\rightarrow D$,出栈顺序:$D\rightarrow C\rightarrow B\rightarrow A$
如果有$n$个不同的元素进栈,出栈元素不同排列的个数为$\dfrac{1}{n+1}C_{2n}^n$,这就是卡特兰数。
@@ -12,15 +12,33 @@
### 顺序栈定义
设置栈顶指针可以为$0$(代表栈顶元素的下一个存储单元)也可以为$-1$(代表栈顶元素当前未知),
### 顺序栈操作
#### 顺序栈初始化
栈顶指针初始化为-1因为索引最小为0。如果初始化为0也可以,不过其操作有所不同。
栈顶指针初始化为$-1$,因为索引最小为$0$。如果初始化为$0$也可以,不过其操作有所不同。
#### 进栈
首先要判满,然后才能进栈。若栈顶指针指的是当前元素,即初值为$-1$,需要先自加再进栈,如果不先自加就会覆盖在原来的栈顶元素上。若栈顶指针指的是当前元素的下一个位置,即初值为$0$,则先进栈再自加,因为指向的下一个位置,所以指向的位置是空的,所以可以存入然后自加,若先自加则中间就空了一格。
#### 出栈
首先要判空,然后才能出栈。若栈顶指针指的是当前元素,即初值为$-1$,需要先出栈再自减,如果由于指的是当前元素所以要先将这个指向的元素弹出,然后自减,否则弹出的就是靠近栈底的下一个元素。若栈顶指针指的是当前元素的下一个位置,即初值为$0$,则先自减再出栈,因为指向的下一个位置,所以指向的位置是空的,要先自减指向有元素的一格才能出栈。
对于出栈元素的处理,既可以将原来的存储单元设置为`NULL`也可以不处理,因为栈顶指针不指向这些单元,用户是不知道里面是什么的,之后重新用到这些存储单元也会覆盖原来的数据。
### 共享栈
即根据栈底不变,让两个顺序栈共享一个一维数组,将两个栈的栈底设在数组两端,栈顶向共享空间延申。
存取数据时间复杂度为$O(1)$。
## 链栈
链栈基本上就是只能操作一头的链表,所以从定义上其基本上没有区别。
链栈基本上就是只能操作一头的链表,所以从定义上其基本上没有区别。基本上以表头为栈顶。
## 栈的应用