队列(顺序)

顺序队列是一段连续的地址,但是存在假溢出情况,所以要用循环队列来实现,具体操作像钟表

下面是顺序队列的表示与实现:

#include <iostream>
using namespace std;
//顺序循环队列的基本表示和实现

const int MAX_SIZE = 100;//定义队列长度
struct SqQueue
{
    int * base;
    int front ;
    int rear;
};
//初始化队列 注意队尾队首指针的初始化
bool InitQueue(SqQueue &sq)
{
    sq.base=(int*)malloc(sizeof(int));
    if (!sq.base)
    {
        return false;
    }
    sq.front=sq.rear=0;
    cout<<"Initial Queue Successfully!"<<endl;
    return true;
}
//返回队列的长度
int QueueLength(SqQueue &sq)
{
    return (sq.rear-sq.front+MAX_SIZE)%(MAX_SIZE);
}

//插入元素e为 队列的队尾元素
bool EnQueue(SqQueue &sq,int e)
{
    if ((sq.rear+1)%(MAX_SIZE)==sq.front)//循环队列 判断队列是否满了
    {
        cout<<"sorry ,overflow"<<endl;
        return false;
    }
    sq.base[sq.rear]=e;
    sq.rear=(sq.rear+1)%MAX_SIZE;//如果钟表走到12点 下一个将走到1点
    return true;
}

//删除队首元素 用e返回
bool DeQueue(SqQueue &sq,int &e)
{
    if (sq.front==sq.rear)//判断队列是否为空
    {
        cout<<"Sorry,the queue is empty"<<endl;
        return false;
    }
    e=sq.base[sq.front];
    sq.front=(sq.front+1)%MAX_SIZE;
    return true;
}

//打印队列
void PrintQueue(const SqQueue sq)
{
    if (sq.rear==sq.front)
    {
        cout<<"Sorry,the queue is empty"<<endl;
        return;
    }
    cout<<"Now print the new queue:"<<endl;
    int index=0;
    index=sq.front;
    while (index!=sq.rear)
    {
        cout<<sq.base[index]<<endl;
        index=(index+1)%MAX_SIZE;
    }
}

void main()
{
    SqQueue sq={0};
    InitQueue(sq);
    int ElemNum=0;
    cout<<"请输入要插入元素的个数:";
    cin>>ElemNum;
    int Elem=0;
    for (int i=0;i<ElemNum;i++)
    {
        cout<<"请输入要插入第 "<<i+1<<" 个元素:";
        cin>>Elem;
        if (EnQueue(sq,Elem))
        {
            cout<<"插入成功"<<endl;;
        }
    }
    PrintQueue(sq);//打印队列
    int delnum;
    DeQueue(sq,delnum);//删除第一个元素
    cout<<"the delete num is :"<<delnum<<endl;
    PrintQueue(sq);//打印队列
    DeQueue(sq,delnum);
    DeQueue(sq,delnum);
    PrintQueue(sq);//打印队列
}

结果如下图所示:

原文地址:https://www.cnblogs.com/mu-tou-man/p/3899763.html