学习23王道数据结构笔记
三 、队列
首先,这个是顺序存储的队列
其次,它是循环的
要有这么一个框架的认识,后面我记录链式存储的队列
这里我抄一下书上的原话:
循环队列的概念:(P79)
将顺序队列臆造(想象)为一个环状的空间,即把存储队列元素的表从逻辑上视为一个环,称为循环队列。当队首指针Q.front = MaxSize-1后,再前进一个位置就自动到0,这可以利用除法取余运算(%)来实现。
定义:
typedef struct{
ElemType data[MaxSize];
int front,rear;
}SqQueue;
初始时:
//初始化
void InitQueue(SqQueue &Q){
Q.rear = Q.front = 0;
}
入队:
//入队
bool EnQueue(SqQueue &Q,ElemType x){
if((Q.rear+1)%MaxSize == Q.front)
return false; //队满判错
Q.data[Q.rear] = x;
Q.rear = (Q.rear+1)%MaxSize;
return true;
}
这里可以分为队首指针进或者队尾指针进,这里书上就是用的队首指针进。
出队:
//出队
bool DeQueue(SqQueue &Q,ElemType x){
if(Q.rear== Q.front)
return false; //队空判错
x = Q.data[Q.front];
Q.front = (Q.front+1)%MaxSize;
return true;
}
整体代码:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
//宏定义数值
#define N 101
#define MaxSize 50
//宏定义类型
#define ElemType int
int arr[N],brr[N];
int n,m;
bool flag,judge;
typedef struct{
ElemType data[MaxSize];
int front,rear;
}SqQueue;
//初始化
void InitQueue(SqQueue &Q){
Q.rear = Q.front = 0;
}
//判断空
bool isEmpty(SqQueue Q){ //这里的队空注意看有没有size和tag,具体的区别搞忘了看书吧,一两句说不完
if(Q.rear == Q.front)
return true; //队空条件
else
return false;
}
//入队
bool EnQueue(SqQueue &Q,ElemType x){
if((Q.rear+1)%MaxSize == Q.front)
return false; //队满判错
Q.data[Q.rear] = x;
Q.rear = (Q.rear+1)%MaxSize;
return true;
}
//出队
bool DeQueue(SqQueue &Q,ElemType x){
if(Q.rear== Q.front)
return false; //队空判错
x = Q.data[Q.front];
Q.front = (Q.front+1)%MaxSize;
return true;
}
//*** 顺序存储结构的队列运用 ***//
//不是线性的,是循环的,由于38排对其取了mod
int main(){
SqQueue Q; //定义
InitQueue(Q); //初始化
//其实就是一个数组,但是我们要遵循队列的规则
//队列的出入由于遵从FIFO,即先进先出的逻辑,这里就简单的带入数据直接操作
for(int i=5;i<15;i++)
EnQueue(Q,i); //入队
DeQueue(Q,1);
//显示一波
for(int i=Q.front;i<Q.rear;i++)
cout <<" "<< Q.data[i];
return 0;
}
运行结果: