循环队列-顺序结构
#define _CRT_SECURE_NO_WARNINGS
#include "iostream"
#include "stdlib.h"
#include "windows.h"
using namespace std;
#define OK 1
#define ERROR 0
#define M 100
typedef int QElemType;
//循环队列顺序存储结构
typedef struct {
QElemType *base;//队列的基地址
int front;
int rear;//队列的头、尾指针
int queuesize;//队列初始分配容量
}SqQueue;
//操作集合
QElemType InitQueue(SqQueue &Q);//初始化队列 //ok
int QueueEmpty(SqQueue Q);//判队空
int QueueFull(SqQueue Q);//判队满
int QueueLength(SqQueue Q);
int EnQueue(SqQueue &Q, QElemType e);//入队列 //ok
int DeQueue(SqQueue &Q, QElemType &e);//出队列 //ok
QElemType GetHead(SqQueue Q);//取循环队列的头元素 //ok
void TraverseQueue(SqQueue Q);//遍历队列 //ok
void f() {
SqQueue q;
QElemType e;
InitQueue(q);
for(int i=0;i<5;i++)
EnQueue(q,i);
TraverseQueue(q);
cout <<endl<< "队列长度为:" << QueueLength(q) << endl<<endl;
cout << "队头元素为:" << GetHead(q) << endl<<endl;
cout << endl << "删除头元素后";
DeQueue(q, e);
TraverseQueue(q);
cout << endl << "队列长度为:" << QueueLength(q) << endl << endl;
cout << "队头元素为:" << GetHead(q) << endl << endl<<endl;
system("pause");
}
int main() {
f();
return 0;
}
QElemType InitQueue(SqQueue &Q)
{//构造一个空队列Q
Q.base = new QElemType[M];
if (!Q.base)
exit(OVERFLOW);
Q.front = Q.rear = 0;
return OK;
}
int QueueEmpty(SqQueue Q)
{
if(Q.front ==Q.rear )
return OK;
}
int QueueFull(SqQueue Q)
{
if((Q.rear +1)%M==Q.front )
return 0;
}
int QueueLength(SqQueue Q)
{
return (Q.rear - Q.front + M) % M;
}
int EnQueue(SqQueue &Q, QElemType e)
{//插入元素e为Q的新的队尾元素
if ((Q.rear + 1) % M == Q.front)
return ERROR;
Q.base[Q.rear] = e;
Q.rear = (Q.rear + 1) % M;
return OK;
}
int DeQueue(SqQueue & Q, QElemType & e)
{
if (Q.front == Q.rear)
return ERROR;
e = Q.base[Q.front];
Q.front = (Q.front + 1) % M;
return OK;
}
QElemType GetHead(SqQueue Q)
{//返回Q的队头元素,不修改头指针
if(Q.front !=Q.rear )
return Q.base [Q.front ];
}
void TraverseQueue(SqQueue Q)
{
cout << "队列中的元素为:" << endl;
int i = Q.front;
while (i!=Q.rear ) {
cout << Q.base[i] << " ";
i = (i + 1) % M;
}
cout << endl;
}