队列的基本定义
队列限定允许在一端进行插入,允许在另一端进行删除,允许删除的一端称为队头(front),允许插入的一端称为队尾(rear),在对头进行的删除操作称为出队列操作(DeQueue),在队尾进行的插入操作被称为入队列操作(EnQueue)。
①循环队列
线性表的顺序存储结构同样适用于队列,可以用一组地址连续的存储单元一次存储队列中的数据元素,由于在队列的操作中,队列的头指针和尾指针只增加不减少,空间不能重复利用,会造成“假溢出”,有两种解决方法。
1.使队头(front)始终为0,每次元素出栈后,把后面的元素往前移动,效率不高。
2.将存储空间设想为圆形,也就是循环队列。
基本操作
1.初始化操作InitQueue(CqQueue &Q)
2.判空操作QueueEmpty(CqQueue Q)
3.求循环队列长度QueueLength(CqQueue Q)
4.入队列EnQueue(CqQueue &Q)
5.出队列DeQueue(CqQueue &Q,int &e)
6.取队头元素GetHead(CqQueue Q,int &e)
代码实现
#include <iostream>
#include <cstdlib>
#define QMAXSIZE 100
using namespace std;
typedef struct{
int *elem;
int front,rear;
}CqQueue;
void InitQueue(CqQueue &Q){ //初始化操作
Q.elem=(int*)malloc(QMAXSIZE* sizeof(int));
if(!Q.elem)
return ;
Q.front=Q.rear=0;
}
int QueueEmpty(CqQueue Q){ //判空操作
if(Q.rear==Q.front)
return 1;
return 0;
}
int QueueLength(CqQueue Q){ //求队列长度
return (Q.rear-Q.front+QMAXSIZE)%QMAXSIZE;
}
void EnQueue(CqQueue &Q,int e){ //入队列
if((Q.rear+1)%QMAXSIZE==Q.front){
cout<<"队列已满!"<<endl;
return ;
}
Q.elem[Q.rear]=e;
Q.rear=(Q.rear+1)%QMAXSIZE;
}
void DeQueue(CqQueue &Q,int &e){ //出队列
if(QueueEmpty(Q)){
cout<<"空队列!"<<endl;
return ;
}
e=Q.elem[Q.front];
Q.front=(Q.front+1)%QMAXSIZE;
}
void GetHead(CqQueue Q,int &e){ //取队首元素
if(QueueEmpty(Q)){
cout<<"空队列!"<<endl;
return ;
}
e=Q.elem[Q.front];
}
void QueueDisplay(CqQueue Q){ //遍历队列
cout<<"队列输出:"<<endl;
while(Q.front%QMAXSIZE!=Q.rear)
cout<<Q.elem[(Q.front++)%QMAXSIZE]<<" ";
cout<<endl;
}
int main()
{
CqQueue Q;
InitQueue(Q);
int n,e;
cout<<"输入队列长度:";
cin>>n;
for(int i=0;i<n;i++){
cin>>e;
EnQueue(Q,e);
}
QueueDisplay(Q);
if(QueueEmpty(Q))
cout<<"队列为空!"<<endl;
else cout<<"队列非空!"<<endl;
cout<<"队列的长度为:"<<QueueLength(Q)<<endl;
cout<<"出队操作!"<<endl;
DeQueue(Q,e);
QueueDisplay(Q);
GetHead(Q,e);
cout<<"队首元素为:"<<e<<endl;
}
②链队列
采用链式存储结构存储的队列。
基本操作
1.初始化操作InitQueue(LinkQueue &Q)
2.判空操作QueueEmpty(LinkQueue Q)
3.求循环队列长度QueueLength(LinkQueue Q)
4.入队列EnQueue(LinkQueue &Q)
5.出队列DeQueue(LinkQueue &Q,int &e)
6.取队头元素GetHead(LinkQueue Q,int &e)
代码实现
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct QNode{
int date;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
void InitQueue(LinkQueue &Q){ //初始化操作
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front)
return ;
Q.front->next=NULL;
}
int QueueEmpty(LinkQueue Q){ //判空操作
if(Q.front==Q.rear)
return 1;
return 0;
}
void EnQueue(LinkQueue &Q,int e){ //入队列
QueuePtr s=(QueuePtr)malloc(sizeof(QNode));
s->date=e;
s->next=NULL;
Q.rear->next=s;
Q.rear=s;
}
void DeQueue(LinkQueue &Q,int &e){ //出队列
if(Q.front==Q.rear)
return ;
QueuePtr s=Q.front->next;
Q.front->next=s->next;
e=s->date;
if(Q.rear==s)
Q.rear=Q.front;
}
void GetHead(LinkQueue Q,int &e){ //取队首元素
if(Q.front==Q.rear){
cout<<"队列为空!"<<endl;
return ;
}
e=Q.front->next->date;
cout<<"队首元素为:"<<e<<endl;
}
void QueueDisplay(LinkQueue Q){ //遍历队列
cout<<"队列输出:"<<endl;
while(Q.front!=Q.rear){
cout<<Q.front->next->date<<" ";
Q.front=Q.front->next;
}
cout<<endl;
}
int main()
{
LinkQueue Q;
InitQueue(Q);
int n,e;
cout<<"输入队列长度:";
cin>>n;
for(int i=0;i<n;i++){
cin>>e;
EnQueue(Q,e);
}
QueueDisplay(Q);
if(QueueEmpty(Q))
cout<<"队列为空!"<<endl;
else cout<<"队列非空!"<<endl;
cout<<"出队列操作!"<<endl;
DeQueue(Q,e);
QueueDisplay(Q);
GetHead(Q,e);
}