数组模拟实现顺序队列

75 阅读1分钟

以下代码根据《大话数据结构》提供的代码编写,用于模仿和练习:

#include <bits/stdc++.h>
using namespace std;
#define MAXSIZE 20
//循环队列的顺序存储结构
typedef struct
{
    int data[MAXSIZE];
    int front;
    int rear;
}SqQueue;
//访问
int visit(int c)
{
    cout<<c<<" ";
    return 1;
}
//初始化一个空队列Q
int InitQueue(SqQueue *Q)
{
    Q->front=0;
    Q->rear=0;
    return 1;
}
//将Q清为空队列
int ClearQueue(SqQueue *Q)
{
    Q->front=Q->rear=0;
    return 1;
}
//判断是否为空
int QueueEmpty(SqQueue Q)
{
    if(Q.front==Q.rear) return 1;
    else return 0;
}
//返回队列长度
int QueueLength(SqQueue Q)
{
    return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
//队列不空则用e返回头元素
int GetHead(SqQueue Q,int &e)
{
    if(Q.front==Q.rear) return 0;
    e=Q.data[Q.front];
    return 1;
}
//队列不满,则插入e为新元素
int EnQueue(SqQueue *Q,int e)
{
    if((Q->rear+1)%MAXSIZE==Q->front) return 0;
    Q->data[Q->rear]=e;
    Q->rear=(Q->rear+1)%MAXSIZE;
    return 1;
}
//队列不空,则删除头元素,用e返回
int DeQueue(SqQueue *Q,int &e)
{
    if(Q->front==Q->rear) return 0;
    e=Q->data[Q->front];
    Q->front=(Q->front+1)%MAXSIZE;
    return 1;
}
//输出队头->队尾
int QueueTraverse(SqQueue Q)
{
    int i=Q.front;
    while(i!=Q.rear)
    {
        visit(Q.data[i]);
        i=(i+1)%MAXSIZE;
    }
    cout<<endl;
    return 1;
}
//主函数
int main()
{
	int e;
	int d;
    int i=0;
    SqQueue Q;
	InitQueue(&Q);
    cout<<"空?"<<QueueEmpty(Q)<<endl;
    cout<<"输入整行队列元素,数量不超过"<<MAXSIZE-1<<"输入-1提前结束"<<endl;
    do
    {
        cin>>d;
        if(d==-1) break;
        i++;
        EnQueue(&Q,d);
    } while (i<MAXSIZE-1);
    cout<<"队列长度:"<<QueueLength(Q)<<endl;
    cout<<"空?"<<QueueEmpty(Q)<<endl;
    GetHead(Q,e);
    cout<<"头?"<<e<<endl;
    cout<<"插入5:"<<endl;
    EnQueue(&Q,5);
    DeQueue(&Q,e);
    cout<<"整体输出"<<endl;
    QueueTraverse(Q);
    cout<<"删除的是:"<<e<<endl;
    ClearQueue(&Q);
    cout<<"空?"<<QueueEmpty<<endl;
    system("pause");
    return 0;
}

在循环队列中

计算队列长度:(rear-front+MAXSIZE)%MAXSIZE

判断空:rear==front

判断满:(rear+1)%MAXSIZE==front

循环队列会出现套圈的现象,所以时刻记得对最大容量取余