/*循环队列*/
#include<bits\stdc++.h>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXQSIZE 100
#define FALSE 0
#define TRUE 1
typedef int QElemType;
typedef int Status;
typedef struct
{
QElemType *base;
int front;
int rear;//是末尾元素前面的位置
}SqQueue;
Status InitQueue(SqQueue &Q)//初始化循化队列
{
Q.base=(QElemType*)malloc(sizeof(QElemType)*MAXQSIZE);
if(!Q.base)exit(OVERFLOW);
//让头尾指针都指向0
Q.front=Q.rear=0;
return OK;
}
Status DestroyQueue(SqQueue &Q)//销毁
{
//释放掉指针
free(Q.base);
//让首尾指向0
Q.front=Q.rear=0;
return OK;
}
Status ClearQueue(SqQueue &Q)//清空队列
{
//只需要将首尾指向0
Q.front=Q.rear;
return OK;
}
Status EnQueue(SqQueue &Q,QElemType e)//加入元素
{
//先判断循环队列是已满
//因为要分辨当front和rear相等的时候是满了还是没有
//所以就要在rear+1取余之后等于front也就是还有一个元素就满了的时候判断满了
//不管rear在前还是front在前只要尾指针加一取余之后等于首指针就说明还有一个元素就满了
if((Q.rear+1)%MAXQSIZE==Q.front)return ERROR;
//rear加一是下次放的位置,如果下次放的位置到了front就满了
Q.base[Q.rear]=e;
//加数之后可能会越界,所以取余
Q.rear=(Q.rear+1)%MAXQSIZE;
return OK;
}
Status DeQueue(SqQueue &Q,QElemType &e)//删除队头元素
{
if(Q.front==Q.rear)return ERROR;
e=Q.base[Q.front];
//只要出现越界就取余直接到0号位置
Q.front=(Q.front+1)%MAXQSIZE;
return OK;
}
Status GetHead(SqQueue Q,QElemType &e)//获取队头元素
{
if(Q.front==Q.rear)return ERROR;
e=Q.base[Q.front];
return OK;
}
int QueueLength(SqQueue Q)//求队列长度
{
//让尾指针不存数据是为了像栈一样便于求长度
//当尾指针在首指针前面的时候加上数组长度就是真实长度
return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}
Status QueueEmpty(SqQueue S)//判断是否为空
{
//因为入队的时候不会让队满,所以下面的条件就没有了二义性
if(S.front==S.rear)return TRUE;
return FALSE;
}
void visit(QElemType e)
{
cout<<e<<endl;
}
Status QueueTraverse(SqQueue Q,Status (*visit)(QElemType))//遍历进行操作
{
for(int i=Q.front;i!=Q.rear;i=(i+1)%MAXQSIZE)
(*visit)(Q.base[i]);
return OK;
}
循环队列的基础操作
最新推荐文章于 2023-11-05 14:26:00 发布