1.首先要先明白几个概念:
队首?(front)?:允许进行删除的一端称为队首。 队尾?(rear)?:允许进行插入的一端称为队尾。
队列是先进先出 ?
2.当进队的时候,rear指针是向后运动的;
当出队的时候,front指针也是向后运动的;
因此这样经过一系列的操作后,两个指针最终会到达数组的末端处,虽然队中已没有了数据,但是仍然无法插入元素,这就是所谓的“假溢出”。为了解决假溢出的问题,可以将数组弄成一个环状,让rear和front指针沿着环走,这样就不会出现无法继续走下去的情况,这样就产生了循环队列。
3.队空状态 :q.rear == q.front ?? 队满状态 : (q.rear + 1) % maxsize == q.front ? ?元素的进队操作 ?:q.rear = (q.rear + 1) % maxsize ; q.data[q.rear] = x ; ? ?元素的出队操作 ?:q.front = (q.front + 1) % maxsize ; x = q.data[q.front] ; ? ?注!!?:数据入队时是先移动指针,然后再存入元素;元素出队时也是先移动指针,后数据出队
#include <bits/stdc++.h>
#define maxsize 100
using namespace std;
typedef struct node
{
int data[maxsize];
int frontt;//队列的头部
int rear;//队列的尾部
}lqueue;
void initqueue(lqueue &q)//初始化队列,q是队列的名字
{
q.frontt=q.rear=0;
}
int isempty(lqueue &q)
{
if(q.frontt==q.rear)
{
return 1;
}
else
{
return 0;
}
}
//入队
int inqueue(lqueue &q,int x)
{
if((q.rear+1)%maxsize==q.frontt)
{
return 0;
}
q.rear=(q.rear+1)%maxsize;
q.data[q.rear]=x;
return 1;
}
int outqueue(lqueue &q,int &x)//函数运行完之后还不能释放,在主函数中还有作用,因此要在前面加
//上&符号.而且我用的是int去定义这个函数,这个函数是有返回值的,所以x还不能释放掉,形参和实参是同一个的
{
if(q.frontt==q.rear)
{
return 0;
}
q.frontt=(q.frontt+1)%maxsize;
x=q.data[q.frontt];
return 1;
}
int main()
{
int n,x,y;
lqueue q;
initqueue(q);
printf("输入要输入的数据的总数:");
cin>>n;
for(int i=0;i<n;i++)
{
cin>>y;
inqueue(q,y);
}
while(!isempty(q))
{
outqueue(q,x);
printf("%d ",x);
}
printf("\n");
//cout << "Hello world!" << endl;
return 0;
}
|