概念理解:
队列是一种操作受限的线性表,FIFO。
队列:逻辑结构
顺序队列:使用顺序存储方式实现的队列
循环队列:为了解决假溢出问题,将顺序队列在逻辑上臆造为一个环状空间,但存储结构上还是一片连续的顺序存储空间。
对头指针:front,始终指向队头元素
队尾指针:rear,始终指向队尾元素的下一个位置
出队:Q.front = (Q.front+1)%MaxSize
入队:Q.rear = (Q.rear+1)%MaxSize
队列长度:(Q.rear-Q.front+MaxSize)%MaxSize
判队满:(Q.rear+1)%MaxSize == Q.front
判队空:Q.front == Q.rear
顺序队列结构体:
#define MaxSize 5
//队列的顺序存储结构
typedef struct{
int data[MaxSize];
//队头指针,指向队头元素
int front;
//队尾指针,指向队尾元素的下一个位置
int rear;
} SqQueue;
初始化队列:
//初始化队列
bool InitQueue(SqQueue &Q){
Q.front = Q.rear = 0;
}
判空:
//判空
bool QueueEmpty(SqQueue Q){
if(Q.front == Q.rear){
return true;
}
return false;
}
入队:
//入队
bool EnQueue(SqQueue &Q,int 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,int &x){
//判队空
if(Q.front == Q.rear){
return false;
}
x = Q.data[Q.front];
Q.front = (Q.front+1)%MaxSize;
return true;
}
读对头元素:
//读队头元素
bool GetHead(SqQueue Q,int &x){
//判队空
if(Q.front == Q.rear){
return false;
}
x = Q.data[Q.front];
return true;
}
测试:
#include <stdio.h>
#include <stdlib.h>//使用malloc和free关键字需要引入这个库
#define MaxSize 5
//队列的顺序存储结构
typedef struct{
int data[MaxSize];
//队头指针,指向队头元素
int front;
//队尾指针,指向队尾元素的下一个位置
int rear;
} SqQueue;
//初始化队列
bool InitQueue(SqQueue &Q){
Q.front = Q.rear = 0;
}
//判空
bool QueueEmpty(SqQueue Q){
if(Q.front == Q.rear){
return true;
}
return false;
}
//入队
bool EnQueue(SqQueue &Q,int 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,int &x){
//判队空
if(Q.front == Q.rear){
return false;
}
x = Q.data[Q.front];
Q.front = (Q.front+1)%MaxSize;
return true;
}
//读队头元素
bool GetHead(SqQueue Q,int &x){
//判队空
if(Q.front == Q.rear){
return false;
}
x = Q.data[Q.front];
return true;
}
int main(){
//声明一个顺序队列
SqQueue Q;
//初始化
InitQueue(Q);
printf("当前队列是否为空:%d\n",QueueEmpty(Q));
//入队
EnQueue(Q,4);
EnQueue(Q,3);
EnQueue(Q,2);
EnQueue(Q,1);
printf("当前队列是否为空:%d\n",QueueEmpty(Q));
//读栈顶元素
int x = NULL;
GetHead(Q,x);
printf("当前队头元素:%d\n",x);
//出队
DeQueue(Q,x);
printf("出队元素:%d\n",x);
GetHead(Q,x);
printf("当前队头元素:%d\n",x);
printf("当前队列长度:%d\n",(Q.rear-Q.front+MaxSize)%MaxSize);
}