循环队列的顺序存储结构,队列的初始化,增删改查。front标记队头,rear标记队尾,当rear=front时队列为空,当队伍中静态存储空间只剩下一个位置时,默认队列已满,牺牲一个存储空间换取rear和front在逻辑上的标记便利。
#include <iostream>
#define MaxSize 10
using namespace std;
struct SqQueue{
int data[MaxSize];
int front,rear;//front为队头,rear为下一个入队的位置
};
void InitQueue(SqQueue &Q){
Q.front=Q.rear=0;
}//初始化队列
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;
}//出队
int main(void){
SqQueue Q;
InitQueue(Q);
int x;
for(int i=0;i<5;i++){
Q.data[i]=i;
Q.rear=(Q.rear+1)%MaxSize;
}//将0-4入队
if(EnQueue(Q,5)){
int front=Q.front,rear=Q.rear;
while(front!=rear){
cout<<Q.data[front]<<" ";
front=(front+1)%MaxSize;
}
cout<<endl;
}
if(DeQueue(Q,x)){
cout<<x<<"已出队"<<endl;
}
if(DeQueue(Q,x)){
cout<<x<<"已出队"<<endl;
int front=Q.front,rear=Q.rear;
while(front!=rear){
cout<<Q.data[front]<<" ";
front=(front+1)%MaxSize;
}
cout<<endl;
}
x=(Q.rear+MaxSize-Q.front)%MaxSize;//求队列元素个数
cout<<"队列中的元素有"<<x<<"个"<<endl;
}
队列的链式存储结构,链式队列(带头结点)的初始化,入队出队。和单链表不同的是新增一个LinkQueue的结构体,结构体里的front和rear指针分别标记队列的队头元素和队尾元素的地址。front指的是没有数据的头结点,Q.front->next指向的才是队头元素。
#include <iostream>
using namespace std;
struct LinkNode{
int data;
LinkNode *next;
};
struct LinkQueue{
LinkNode *front,*rear;
};
void InitQueue(LinkQueue &Q){
Q.front=Q.rear=new LinkNode;
}//初始化队列
void EnQueue(LinkQueue &Q,int x){
LinkNode *s=new LinkNode;
s->data=x;
s->next=NULL;
Q.rear->next=s;
Q.rear=s;
}//将x入队
bool DeQueue(LinkQueue &Q,int &x){
if(Q.front==Q.rear)
return false;
LinkNode *p=new LinkNode;
p=Q.front->next;
x=p->data;
Q.front->next=p->next;
if(p==Q.rear)
Q.rear=Q.front;
delete p;
return true;
}//将x出队
int main(void){
LinkQueue Q;
InitQueue(Q);
for(int i=0;i<5;i++){
EnQueue(Q,i);
}//将0-4依次入队
int x;
if(DeQueue(Q,x))
cout<<x<<"已出队"<<endl;
if(DeQueue(Q,x))
cout<<x<<"已出队"<<endl;
EnQueue(Q,5);
while(DeQueue(Q,x))
cout<<x<<"已出队"<<endl;
}