1
0
mirror of https://github.com/142vip/408CSFamily.git synced 2026-04-15 02:41:07 +08:00

add sq Queue

This commit is contained in:
mmdapl
2021-03-18 08:14:17 +08:00
parent aad560dec2
commit 7506969bd5
7 changed files with 84 additions and 3 deletions

BIN
.DS_Store vendored

Binary file not shown.

BIN
数据结构/.DS_Store vendored

Binary file not shown.

Binary file not shown.

View File

@@ -4,7 +4,7 @@
* @Author: 【B站&公众号】Rong姐姐好可爱
* @Date: 2020-03-1 07:23:48
* @LastEditors: 【B站&公众号】Rong姐姐好可爱
* @LastEditTime: 2021-03-17 08:26:30
* @LastEditTime: 2021-03-17 23:23:09
-->
@@ -38,7 +38,7 @@ typedef struct {
则:
- 初始状态:`Q.front`===`Q.rear`===0
- 初始状态**队空条件**`Q.front`===`Q.rear`===0
- 入队操作:队不满时,先赋值给队尾元素,再移动队尾指针+1
- 出队操作: 队不空时,先取队头元素值,再移动队头指针+1
@@ -85,4 +85,85 @@ typedef struct {
### 循环队列
### 循环队列
在上面的顺序队列中,当队满后进行出队列,由于顺序队列出队只在队首进行操作,并且只会修改队首指针,这时候就会出现队尾指针一直`Q.rear===MaxSize`情况,就如下:
![队列队满情况分析](/数据结构/栈和队列/images/队列队满情况分析.png)
可以很明显的看到,明明队列不满,但是由于进队列只能在队尾操作,因此不能进行进队操作;通常在这种情况下入队就会出现“上溢出”。
> 需要明确的是:上溢出并不是真正的溢出,只是表明在顺序队列中队不满却无法入队的情况,是一种假的”溢出“
这种情况在顺序队列中是非常常见的,也是顺序队列的一大缺点。为了克服这个缺点,计算机先贤们总是能够有很多很好的办法,这里不得不佩服!!,所以就有了循环队列,**一个将顺序队列臆想为一个环状的空间**
> 很多时候就是这样,为了解决一个问题,从而衍生出一个新的知识
`循环队列`:把顺序队列臆想为一个环状的空间,将存储队列元素的表从逻辑上看做为一个环
![](/数据结构/栈和队列/images/循环队列初始化.png)
当队首指针`Q.front=MaxSize-1`后,再有元素`出队`就前进一个位置自动到位置0了【注意可以结合时钟来理解一圈转完了】
- 初始时:`Q.front=Q.rear=0`
- 队首指针进1 `Q.front=(Q.front+1)%MaxSize`
- 队尾指针进1 `Q.rear=(Q.rear+1)%MaxSize`
- 队列长度: `(Q.rear+MaxSize-Q.front)%MaxSize`
是不是理解起来有点抽象,其实我最开始学到这里的时候,也不明白为什么要用`除法取余运算(%`来实现。后来我看看了手机上的时钟指针,一圈两圈三圈的转,好像就开始悟了...
**和时钟一样顺时钟进行时间变换在出队、入队时队首、队尾指针都是按顺时针方向进1**
### 代码实现
#### 初始化空队列
```C++
void InitQueque(&Q){
Q.front=Q.rear=0;
}
```
#### 队列是否为空
```C++
bool isEmpaty(Q){
if(Q.rear=Q.front){
return false;
}else{
return false;
}
}
```
#### 入队
```C++
bool EnSqQueue(SqQueue)
```
#### 出队

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB