队列的定义
1.队列和栈一样,是一种操作受限制的线性表。
2.只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,进行插入操作的端称为队尾,进行删除操作的端称为队头。
3.队列中没有元素时,称为空队列。
4.在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。
4.元素进队,rear自增1;元素出队,front增1。front指向当前队中队头元素的前一位置,当rear=MaxSize-1时队满
队列的种类(存储方式)
1.单向队列
· 顺序队列
· 链队列
2.循环队列(环形队列)
· 顺序队列
· 链队列
单向队列
1.顺序队列
一定要记住的几个操作:
队空条件 | front=rear |
队满条件 | rear=MaxSize-1 |
元素e进队 | rear++;data【rear】=e |
元素e出队 | front++;e=data【front】 |
1.创建队列
//线性表之顺序队列
#define MaxSize 10
typedef struct{
int data[MaxSize];
int front,rear; //队首和队尾指针
}SqQueue;
2.初始化对列
void InitQueue(SqQueue* &q){
q=(SqQueue*)malloc(sizeof(SqQueue));
q->front=q->rear=-1;
}
3.元素进队操作
bool EnQueue(SqQueue* &q,int e){
if(q->rear==MaxSize)return false;//判断队满
q->rear++;
q->data[q->rear]=e;
return true;
}
4.元素出队操作
bool DeQueue(SqQueue* &q,int e){
if(q->front==q->rear)return false;
q->front++;
e=q->data[q->front];
return true;
}
对于rear==MaxSize-1作为队满判断条件的缺陷。当队满为真时,队中可能还存在空位置,下面循环队列会重点补充说明.
2.链式队列
一定要记住的几个操作:
队空条件 | front=NULL或rear=NULL或front=rear |
队满条件 | 无 |
链式队列是队列的实现方式之一。链式队列内部使用带头结点的单向链表来实现。它的好处的是灵活,队列容量理论上是不受限制的。
1.单链表中数据节点类型
typedef struct QNode{
int data;
struct QNode* next;
}QNode;
2.链队头节点类型
typedef struct{
QNode* front; //指向单链表队头节点
QNode* rear; //指向单链表队尾节点
}LiQueue;
3.初始化链队
void InitQueue(LiQueue* &q){
q=(LiQueue*)malloc(sizeof(LiQueue));
q->front=NULL;
q->rear=NULL;
}
4.销毁队列
void DestroyQueue(LiQueue* q){
QNode *p=q->front,*r;
if(p!=NULL){
r=p->next;
while(p!=NULL){
free(p);
p=r; r=p->next;
}
}
free(p);free(q);
}
5.进队操作
void EnQueue(LiQueue* &q,int e){
QNode* p;
p=(QNode*)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;
if(q->rear==NULL)q->front=q->rear=p; //链队为空
else{
q->rear->next=p;
q->rear=p;
}
}
6.出队操作
bool DeQueue(LiQueue* q,int e){
QNode* t;
if(q->rear==NULL)return false;
t=q->front;
if(q->front==q->rear)q->front=q->rear=NULL;
else q->front=q->front->next;
e=t->data;
free(t);
return true;
}
如果对于文章没有提及的观点、错误的地方、或者更好的方法、比较好的学习方法,欢迎在评论区留言~