mirror of
https://github.com/Didnelpsun/CS408.git
synced 2026-02-11 14:45:57 +08:00
更新数据结构
This commit is contained in:
@@ -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)$。
|
||||
|
||||
## 链栈
|
||||
|
||||
链栈基本上就是只能操作一头的链表,所以从定义上其基本上没有区别。
|
||||
链栈基本上就是只能操作一头的链表,所以从定义上其基本上没有区别。基本上以表头为栈顶。
|
||||
|
||||
## 栈的应用
|
||||
|
||||
|
||||
Reference in New Issue
Block a user