目录
一、队列的基础知识
定义:队列,简称队,也是一种操作受限的元素,只允许在表的一端进行插入,而在表尾的另一端进行删除。向队列中插入元素称为入队或进队。删除元素称为出队或离队。其操作的特性是先进先出。
队头(front):允许插入的一端
队尾(rear):允许删除的一端
空队列:不含任何元素的空表
二、循环队列
1.数组结构化
#define MaxSize 10
typedef int ElemType;
typedef struct{
ElemType data[MaxSize];
int rear,front;//队尾,队头
}SqQueue;
2.初始化队列
void InitQueue(SqQueue &Q){
Q.rear=Q.front=0;//初始化队列
}
3.判空操作
bool isEmpty(SqQueue Q){
return Q.rear==Q.front;//判空操作
}
4.入队操作:
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;
}
5.出队操作
bool DeQueue(SqQueue &Q,ElemType &x){
if(Q.front==Q.rear){
return false;
}
x=Q.data[Q.front];
Q.front=(Q.front+1)%MaxSize;
return false;
}
6.全部代码
/*
1,初始化循环队列
2.判断是否为空
3.入队
4.出队
*/
//循环队列的代码实战
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 5
typedef int ElemType;
typedef struct{
ElemType data[MaxSize];
int front,rear;
}SqQueue;
void InitQueue(SqQueue &Q ){
Q.front=Q.rear=0;
}
bool isEmpty(SqQueue Q){
return Q.rear==Q.front;
}
//入队
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;
}
bool DeQueue(SqQueue &Q,ElemType &x){
if(Q.rear==Q.front){
return false;
}
x=Q.data[Q.front];
Q.front=(Q.front+1)%MaxSize;
}
int main(){
SqQueue Q;
bool ret;
InitQueue(Q);
ret=isEmpty(Q);
if(ret){
printf("The queue is Empty!\n");
}else{
printf("The queue isn't Empty!\n");
}
EnQueue(Q,3);
EnQueue(Q,4);
EnQueue(Q,5);
ret=EnQueue(Q,6);
ret=EnQueue(Q,7);
if(ret){
printf("EnQueue success!\n");
}else{
printf("EnQueue failed!\n");
}
ElemType element;
ret=DeQueue(Q,element);
if(ret){
printf("DeQueue success!\n");
}else{
printf("DeQueue success!\n");
}
return 0;
}
三、链式队列
代码
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LinkNode{
ElemType data;
struct LinkNode *next;
}LinkNode;
typedef struct{
LinkNode *front,*rear;
}LinkQueue;
//对列的初始化用的是带头结点的
void InitQueue(LinkQueue &Q){
Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));//头和尾指向同一个结点
Q.front->next=NULL; //头结点的next指针为NULL
}
//入队
void EnQueue(LinkQueue &Q,ElemType x){
LinkNode *pnew=(LinkNode*)malloc(sizeof(LinkNode));//创建新结点,并插入到尾结点
pnew->data=x;
pnew->next=NULL;//要让next为NULL
Q.rear->next=pnew;//尾指针的next指向pnew
Q.rear=pnew;//rear指向新的尾部
}
//出队
bool DeQueue(LinkQueue &Q,ElemType &x){
if(Q.front==Q.rear){
return false;
}
LinkNode* q=Q.front->next;
Q.front->next=q->next;//断链
if(Q.rear==q){
Q.rear=Q.front;
}
free(q);
}
int main(){
LinkQueue Q;
InitQueue(Q);
EnQueue(Q,3);
EnQueue(Q,4);
EnQueue(Q,5);
EnQueue(Q,6);
EnQueue(Q,7);
ElemType element;
bool ret;
ret=DeQueue(Q,element);
if(ret){
printf("DeQueue success element= %d\n",element);
}else{
printf("DeQueue failed\n");
}
return 0;
}