循环队列的顺序存储实现,包括入队,出队,清队,销毁队,遍历队列等
队列(queue)是一种先进先出(first in fist out,缩写为FIFO)的线性表,它只允许在表的一端进行插入,而在另一端进行删除元素。允许插入的一端称为队尾(rear),允许删除的一端称为队头(front)。
具体的代码实现如下
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
#define MAXSIZE 100
#define OVERFLOW -2
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR 1
typedef int QElemType;
typedef int Status;
struct SqQueue
{
QElemType *base;
int front;
int rear;
};
Status InitQueue(SqQueue &Q);
Status DestroyQueue(SqQueue &Q);
Status ClearQueue(SqQueue &Q);
Status QueueEmpty(SqQueue Q);
int QueueLength(SqQueue Q);
Status GetHead(SqQueue Q, QElemType &e);
Status EnQueue(SqQueue &Q, QElemType e);
Status DeQueue(SqQueue &Q, QElemType &e);
void visit(QElemType e);
Status QueueTraverse(SqQueue Q, void(*visit)(QElemType));
Status InitQueue(SqQueue &Q)
{
Q.base = (QElemType *)malloc(MAXSIZE * sizeof(QElemType));
if(!Q.base)
exit(OVERFLOW);
Q.front = Q.rear = 0;
return OK;
}
Status DestroyQueue(SqQueue &Q){
if(Q.base)
free(Q.base);
Q.base = NULL;
Q.front = Q.rear = 0;
return OK;
}
Status ClearQueue(SqQueue &Q){
Q.front = Q.rear = 0;
return OK;
}
Status QueueEmpty(SqQueue Q){
if(Q.front == Q.rear)
return TRUE;
else
return FALSE;
}
int QueueLength(SqQueue Q)
{
return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
}
Status GetHead(SqQueue Q, QElemType &e){
if(Q.front == Q.rear)
return ERROR;
e = Q.base[Q.front];
return OK;
}
Status EnQueue(SqQueue &Q, QElemType e)
{
if((Q.rear + 1) % MAXSIZE == Q.front)
return ERROR;
Q.base[Q.rear] = e;
Q.rear = (Q.rear + 1) % MAXSIZE;
return OK;
}
Status DeQueue(SqQueue &Q, QElemType &e)
{
if(Q.front == Q.rear)
return ERROR;
e = Q.base[Q.front];
Q.front = (Q.front + 1) % MAXSIZE;
return OK;
}
void visit(QElemType e){
cout << e << " ";
}
Status QueueTraverse(SqQueue Q, void(*visit)(QElemType)){
int i;
i = Q.front;
while(i != Q.rear){
visit(Q.base[i]);
i = (i + 1) % MAXSIZE;
}
cout << endl;
return OK;
}
int main()
{
int i = 0,l;
Status j;
QElemType e;
SqQueue Q;
InitQueue(Q);
if(!QueueEmpty(Q))
cout << "队列为空。" << endl;
cout << "请输入值到队列中,长度应小于" << MAXSIZE -1 << endl;
do{
cin >> e;
++i;
if(e == -1){
break;
}
EnQueue(Q,e);
}while(i < MAXSIZE -1);
cout << "队列的长度为:" << QueueLength(Q) << endl;
cout << "开始从队头删除元素,从队尾插入元素:" << endl;
for(i = 0; i < QueueLength(Q); ++i){
DeQueue(Q,e);
cout << "删除的元素为:" << e << ".请输入新的值进行插入:";
cin >> e;
EnQueue(Q,e);
}
l = QueueLength(Q);
cout << "队列的元素为:" << endl;
QueueTraverse(Q,visit);
j = GetHead(Q,e);
cout << "队列的首元素为:" << e << endl;
ClearQueue(Q);
if(!QueueEmpty(Q))
cout << "队列不为空!" << endl;
else
cout << "队列为空!" << endl;
DestroyQueue(Q);
return 0;
}
运行结果如下:

队列不宜像栈那样,进行存储在分配数组空间,因为队列的实际可用空间并未沾满。 |