队列也是一种运算受限制的线性表,它只允许在表的一端进行插入,而另外一段只允许进行删除。
允许删除的一端称为队头(Front);允许删除的一端称为队尾(Rear)。
顺序队列实际上是受限的顺序表,和顺序表一样,顺序队列也必须采用一个数组来存放当前数据元素。
当队尾(Rear)达到 最大位置时(Maxsize)。 表示此时空间不足,已经不能在入队了。但是随着我们出队Front 向前移动, (0~Front) 的空间是剩余的。 我们称这种现象为假上溢。
为了克服假上溢现象:我们讲队列的头尾连起来形成一个环(循环队列), (即 原来 -1 的位置就是现在 Maxsize -1 的位置)
循环队列每次移动思路:
每次移动 Rear = (Rear +1)%Maxsize;
每次移动Front = (Front +1)%Maxsize;
顺序队列
#include<iostream>
#include<cstdio>
using namespace std;
const int Maxsize=1000;
typedef struct node{
int data[Maxsize];
int Front,Rear;///头指针和尾指针,分别指向队头和队尾
}*Sq;
void Init_Sequeue(Sq &Q){
Q->Front=-1;
Q->Rear=-1;
}
int Out_Queue(Sq &Q){///获取队头元素
if(Q->Front>=Q->Rear)
cout<<"Queue id NULL"<<endl;
else
{
Q->Front++;
return Q->data[Q->Front];
}
}
void In_Queue(Sq &Q,int e){///入队
if(Q->Rear>=Maxsize-1)
cout<<"Queue is overfloor"<<endl;
else{
Q->Rear++;
Q->data[Q->Rear]=e;
}
}
int main(){
Sq Q=(Sq)malloc(sizeof(Sq));
Init_Sequeue(Q);
int n,i;
cin>>n;///入队5个数
for(i=1;i<=n;i++)
In_Queue(Q,i);
cout<<"出队序列:";
for(i=1;i<=n;i++)
cout<<Out_Queue(Q)<<" ";
return 0;
}
循环队列(顺序存储)
#include<iostream>
#include<cstdio>
using namespace std;
const int Maxsize = 1000;
typedef struct node{
int data[Maxsize];
int Front,Rear;
}*Sq;
void Init_Queue(Sq &Q){///置空循环队列
Q->Front=Maxsize-1;
Q->Rear=Maxsize-1;
}
bool is_Empty(Sq Q){///判空
if(Q->Front==Q->Rear)
return true;
else
return false;
}
void In_Queue(Sq &Q,int e){///入队
if(Q->Front==((Q->Rear+1)%Maxsize)){///队以满,上溢; 在移动 Front 以前判断之前的尾巴Rear 在移动一个是不是队为,如果是,这表是满了
cout<<"Queue is overfloor"<<endl;
}
else{
Q->Rear=(Q->Rear+1)%Maxsize;///
Q->data[Q->Rear]=e;
}
}
int Out_Queue(Sq &Q){///出队
if(is_Empty(Q))
cout<<"Queue is underfloor"<<endl;
else
Q->Front=(Q->Front+1)%Maxsize;
return Q->data[Q->Front];
}
int GET_head_Queue(Sq Q){///获取当前对头元素
if(is_Empty(Q))
{
cout<<"Queue is NULL"<<endl;
}
else{
int id=(Q->Front+1)%Maxsize;
return Q->data[id];
}
}
int main()
{
Sq Q=(Sq)malloc(sizeof(Sq));
Init_Queue(Q);
int n,i;
cin>>n;
for(i=1;i<=n;i++)
In_Queue(Q,i);
cout<<"获取当前队头元素:"<<GET_head_Queue(Q)<<endl;
cout<<"依次出队:"<<endl;
for(i=1;i<=n;i++)
cout<<Out_Queue(Q)<<" ";
cout<<endl;
return 0;
}