循环队列的顺序表示和实现

一、顺序队列的存储结构

#define MAXSIZE 100//队列可能达到的最大长度
typedef int QElemType;
//队列的顺序存储结构
typedef struct
{
    QElemType *base;//存储空间的基地址
    int front;//头指针
    int rear;//尾指针
} SqQueue;

二、循环队列的初始化

算法步骤:

(1)为队列分配一个最大容量为MAXSIZE的数组空间,base指向数组空间的首地址。

(2)头指针和尾指针置为0,表示队列为空。

//循环队列的初始化
int InitQueue(SqQueue &Q)
{
    //构造一个空队列Q
    Q.base = new QElemType[MAXSIZE];//为队列分配一个最大容量为MAXSIZE的存储空间
    if(!Q.base)
    {
        cout<<"初始化失败!"<<endl;
        return 0;
    }
    Q.front=Q.rear=0;//头指针和尾指针置为0,队列为空
    cout<<"初始化成功!"<<endl;
    return 1;
}

三、循环队列的入队 

算法步骤:

(1)判断队列是否满

(2)将新元素插入队尾

(3)队尾指针加1

//入队
int EnQueue(SqQueue &Q,QElemType e)
{
    if((Q.rear+1)%MAXSIZE==Q.front) //尾指针在循环意义上加一等于头指针,表明队满
    {
        cout<<"入队失败,队满!"<<endl;
        return 0;
    }
    Q.base[Q.rear]=e;//新元素插入队尾
    Q.rear=(Q.rear+1)%MAXSIZE;
    cout<<"入队成功!"<<endl;
    return 1;
}

四、循环队列的出队

算法步骤:

(1) 判断队列是否为空。

(2)保存队头元素。

(3)队头指针加1。

//出队
int DeQueue(SqQueue &Q,QElemType e)
{
    //删除Q的队头元素,用e保存并返回
    if(Q.rear==Q.front)//队空
    {
        cout<<"出队失败,队空!"<<endl;
        return 0;
    }
    e=Q.base[Q.front];//保存队头元素
    Q.front=(Q.front+1)%MAXSIZE;//队头指针加1
    cout<<"出队成功!"<<endl;
    return e;
}

五、求队列长度

//求队列长度
int QueueLength(SqQueue &Q)
{
    //返回Q的元素个数,即队列长度
    return(Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}

六、输入、输出

void InputQueue(SqQueue &Q)
{
    cout<<"哈喽啊,shu,你想先让几个元素入队呢:";
    int n,in;
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cout<<"请输入第"<<i<<"个入队元素:";
        cin>>in;
        EnQueue(Q,in);
    }
}
void OutPutQueue(SqQueue Q)
{

    cout<<"- - - - -"<<endl;
    while(Q.front!=Q.rear)
    {
        cout<<Q.base[Q.front]<<endl;
        Q.front=(Q.front+1)%MAXSIZE;//队头指针加1
    }
    cout<<"- - - - -"<<endl;
}

七、完整代码

#include <iostream>
#define MAXSIZE 100//队列可能达到的最大长度
using namespace std;

typedef int QElemType;
//队列的顺序存储结构
typedef struct
{
    QElemType *base;//存储空间的基地址
    int front;//头指针
    int rear;//尾指针
} SqQueue;

//循环队列的初始化
int InitQueue(SqQueue &Q)
{
    //构造一个空队列Q
    Q.base = new QElemType[MAXSIZE];//为队列分配一个最大容量为MAXSIZE的存储空间
    if(!Q.base)
    {
        cout<<"初始化失败!"<<endl;
        return 0;
    }
    Q.front=Q.rear=0;//头指针和尾指针置为0,队列为空
    cout<<"初始化成功!"<<endl;
    return 1;
}

//求队列长度
int QueueLength(SqQueue &Q)
{
    //返回Q的元素个数,即队列长度
    return(Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
//入队
int EnQueue(SqQueue &Q,QElemType e)
{
    if((Q.rear+1)%MAXSIZE==Q.front) //尾指针在循环意义上加一等于头指针,表明队满
    {
        cout<<"入队失败,队满!"<<endl;
        return 0;
    }
    Q.base[Q.rear]=e;//新元素插入队尾
    Q.rear=(Q.rear+1)%MAXSIZE;//队尾指针加1
    cout<<"入队成功!"<<endl;
    return 1;
}
//出队
int DeQueue(SqQueue &Q,QElemType e)
{
    //删除Q的队头元素,用e保存并返回
    if(Q.rear==Q.front)//队空
    {
        cout<<"出队失败,队空!"<<endl;
        return 0;
    }
    e=Q.base[Q.front];//保存队头元素
    Q.front=(Q.front+1)%MAXSIZE;//队头指针加1
    cout<<"出队成功!"<<endl;
    return e;
}
int GetHead(SqQueue &Q)
{
    //返回Q的队头元素,不修改队头指针
    if(Q.front!=Q.rear) //队列非空
    {
        return Q.base[Q.front];//返回队头元素的值,队头指针不变
    }
}
void InputQueue(SqQueue &Q)
{
    cout<<"哈喽啊,shu,你想先让几个元素入队呢:";
    int n,in;
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cout<<"请输入第"<<i<<"个入队元素:";
        cin>>in;
        EnQueue(Q,in);
    }
}
void OutPutQueue(SqQueue Q)
{

    cout<<"- - - - -"<<endl;
    while(Q.front!=Q.rear)
    {
        cout<<Q.base[Q.front]<<endl;
        Q.front=(Q.front+1)%MAXSIZE;//队头指针加1
    }
    cout<<"- - - - -"<<endl;
}

int main()
{
    SqQueue Q;
    InitQueue(Q);

    InputQueue(Q);
    OutPutQueue(Q);

    int L=QueueLength(Q);
    cout<<"队列长度为:"<<L<<endl;

//出队
    int e;
    int out=DeQueue(Q,e);
    cout<<out<<endl;


    OutPutQueue(Q);


    int L1=QueueLength(Q);
    cout<<"队列长度为:"<<L1<<endl;
    //OutPutQueue(Q);




}

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值