队列是一种先进先出(First In First Out)的线性表,简称FIFO。在队尾进行插入(front),在队头进行删除(rear)。
以下以一个循环队列为例进行实现。
循环队列空的条件是front == rear,当队列满时,保留一个元素空间,则队列满的条件是(rear+1)%MAXSIZE == front;如上图、下图所示。
#include<iostream>
using namespace std;
const int MAXSIZE = 20;
const int OK = 1;
const int ERROR =0;
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType data[MAXSIZE];
int front;//头,出
int rear;//尾,进
}SqQueue;
Status InitQueue(SqQueue* Q)
{
Q->front = 0;
Q->rear =0;
return OK;
}
int QueueLength(SqQueue Q)
{
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
Status EnQueue(SqQueue *Q, ElemType e)
{
if((Q->rear+1)%MAXSIZE == Q->front)//队列满
return ERROR;
Q->data[Q->rear] = e;
Q->rear = (Q->rear+1)%MAXSIZE;
return OK;
}
Status DeQueue(SqQueue *Q,ElemType *e)
{
if(Q->front == Q->rear)//队列空
return ERROR;
*e = Q->data[Q->front];
Q->front = (Q->front+1)%MAXSIZE;
return OK;
}
void PrintQueue(SqQueue Q)
{
for(int i=Q.front;i<Q.rear;i++)//输出按普通队列输出,本demo中的队列是循环队列
cout<<Q.data[i]<<" ";
cout<<endl;
}
int main()
{
SqQueue queueA;
InitQueue(&queueA);
int i=0;
for(i=0;i<10;i++)
{
EnQueue(&queueA, i*i);
cout<<i*i<<"入队列"<<endl;
}
PrintQueue(queueA);
cout<<"=========="<<endl;
ElemType e;
for(i=0;i<5;i++)
{
DeQueue(&queueA, &e);
cout<<e<<"出队列"<<endl;
}
PrintQueue(queueA);
getchar();
return 0;
}
结果