
(以下内容全部来自上述课程)
目录
- 栈
-
- [1. 栈的定义](#1. 栈的定义)
- [2. 基本操作](#2. 基本操作)
- [3. 小结](#3. 小结)
- 顺序栈
-
- [1. 定义](#1. 定义)
- [2. 基本操作](#2. 基本操作)
-
- [2.1 初始化](#2.1 初始化)
- [2.2 进栈操作](#2.2 进栈操作)
- [2.3 出栈操作](#2.3 出栈操作)
- [2.4 读栈顶元素操作](#2.4 读栈顶元素操作)
- [3. 另一种方式](#3. 另一种方式)
- [4. 共享栈](#4. 共享栈)
- [5. 小结](#5. 小结)
- 链栈
- 队列
-
- [1. 定义](#1. 定义)
- [2. 基本操作](#2. 基本操作)
- [3. 小结](#3. 小结)
- 队列的基本操作
-
- [1. 顺序实现](#1. 顺序实现)
-
- [1.1 初始化操作](#1.1 初始化操作)
- [1.2 入队操作](#1.2 入队操作)
- [1.3 循环队列](#1.3 循环队列)
- [2. 判断满空](#2. 判断满空)
- [3. 其他出题方法](#3. 其他出题方法)
- [4. 小结](#4. 小结)
- [5. 链式实现](#5. 链式实现)
-
- [5.1 初始化](#5.1 初始化)
- [5.2 入队](#5.2 入队)
- [5.3 出队](#5.3 出队)
- [5.4 队列满的条件](#5.4 队列满的条件)
- [6. 小结](#6. 小结)
- 双端队列
-
- [1. 定义](#1. 定义)
- [2. 考点](#2. 考点)
- [3. 小结](#3. 小结)
栈

1. 栈的定义
类似于叠石头 ,只能往上叠,而不是塞到下面。



复习:
2. 基本操作


3. 小结

顺序栈

1. 定义
标志 :栈顶指针

2. 基本操作
2.1 初始化
定义结构体-->初始化-->测试使用
因为初始化的时候栈是空的,所以栈顶指针会指向-1,反过来,top=-1就代表了栈空。

2.2 进栈操作
指针指向下一位-->存数据(赋值)
注意 :++在前面,就是先+1再操作;++在后面,就是先操作之后再+1

2.3 出栈操作
先把元素搞出去-->指针指回上一位
ps:逻辑上删除数据是因为指针向下移动了,之前指的数据就不算在栈内了,就是干脆无视它了,但是会残留在内存中。

2.4 读栈顶元素操作
数据慢慢存进去,top一直指向栈顶元素,所以直接按照top的索引得到数据即可。

3. 另一种方式
之前的操作是建立在-----初始化中:栈顶指针指向-1,还没有分配空间的位置。
而接下来的操作是建立在-----初始化中:栈顶指针指向0,分配了空间但是没有存入数据的位置。
由此,索引判断栈空的条件就是top=0.

入栈:先赋值,再移动指针。
出栈:先出栈,再移动指针。

4. 共享栈
之前的栈因为一个地方只能存一个栈的数据,这个栈内的数据可能不总被用到,就导致利用率低。
所以可以将一个栈的空间分给两个栈,这两个栈存各自的数据,栈顶指针就指向各自的栈顶,来提高利用率。

5. 小结

链栈
类比带有限制的链表,这里不再赘述。





队列

1. 定义
类比排队买饭。



2. 基本操作

3. 小结

队列的基本操作
1. 顺序实现
标志:有头指针和尾指针。

1.1 初始化操作
定义结构体-->初始化(头指针尾指针刚开始指向同一个位置)-->测试使用

1.2 入队操作
头指针不动,加入元素,尾指针向后移动。

如图,头指针上面的数据都出队了下面又有数据入队,尾指针需要跳回头指针的下面,也就是队尾,就形成了循环队列(循环队列第一张图)。
这样的操作可以用取余的算法实现。

1.3 循环队列
因为初始化的时候,头指针和尾指针同时指向0,所以如果判断队列满了还是用这个方法就会造成错误。
这里就只能牺牲一个存储单元,避免和初始化的空队列的条件重复。



2. 判断满空
牺牲一个存储单元。


定义size,size满了,就是队列空了。

定义一个tag,插入成功就是0,头尾指针都指向同一个位置并且插入成功的tag=1,就表示队列满了。

3. 其他出题方法
左侧是尾指针指向即将存入数据的空间,也就是尾数据的下一个空间。
右侧是我们上面讲的,尾指针指向尾数据。
所以操作上会有一点点的不同,做题的时候应该注意头尾指针到底指向哪里。



4. 小结

5. 链式实现

定义结点,定义队列。

5.1 初始化
带头结点,头尾指针就都指向头结点。

不带头结点,头尾指针就都指向NULL了。

5.2 入队
- malloc:分配空间
s->data=x;:通过指针s访问新节点的data成员(数据域)是xs->next=NULL;:通过指针s访问新节点的next成员(指针域)是NULLQ.rear->next=s;:问当前队尾节点的next指针域,是sQ.rear=s;:更新队列Q的队尾指针rear,让它指向新节点s(因为s现在是队列的最后一个节点了)
带头结点:
头指针指着头结点,尾指针指向新插入的数据。

不带头结点:
头尾节点都指向新插入的数据。

5.3 出队


5.4 队列满的条件

6. 小结

双端队列
1. 定义


2. 考点




3. 小结

