2020-9-20 //严蔚敏《数据结构》 //队列的顺序表示和实现——循环队列(循环队列是队列的顺序表示)

本文详细探讨了严蔚敏《数据结构》中关于队列的顺序表示,重点在于循环队列的概念,解释了如何利用数组实现循环队列,包括入队和出队的操作,以及如何解决假溢出问题。
摘要由CSDN通过智能技术生成
//严蔚敏《数据结构》
//队列的顺序表示和实现——循环队列(循环队列是队列的顺序表示)
//自学中,加油!!!
#include<iostream>
using namespace std;
const int MaxQSize=5;
#define QElemType double
typedef struct
{
    QElemType* base;
    int head,tail;
}SqQueue;

bool Init_SqQueue(SqQueue& Q)//初始化顺序队列(循环队列),因为顺序,所以需要循环
{
    Q.base=new QElemType;
    if(!Q.base)
        return false;
    Q.head=Q.tail=0;
    return true;
}

bool Input_SqQueue(SqQueue& Q)//向循环队列输入数据
{
    QElemType num;
    cout<<"输入数据 非double停止\n";
    while(cin>>num){
        if((Q.tail+1)%MaxQSize==Q.head){
            cout<<"队列空间已满\n";
            break;
        }
        Q.base[Q.tail++]=num;
    }
    return true;
}

void OutPut_SqQueue(SqQueue Q)//遍历输出循环队列
{
    cout<<"队列数据:\n";
    for(int i=Q.head;i<Q.tail;i++){
        cout<<Q.base[i]<<' ';
    }
    cout<<"\n------\n";
}

bool Clear_SqQueue(SqQueue& Q)//"清空"队列,空队列的定义:队列为空<->Q.head==Q.tail,这个清空并不是实际意义上的清空
                              //和顺序栈的清空类似,清空后原数据仍存在,只不过不能通过Q.head Q.tail 输出数据了
                              //Q.base的空间由Q.base开辟,需要free(Q.base),这个功能放在Destroy中
{
    Q.tail=Q.head;
    return true;
}

bool Destroy_SqQueue(SqQueue& Q)//破坏掉队列,不单单是释放Q.base指向的内存
{
    Clear_SqQueue(Q);
    free(Q.base);
    Q.base=nullptr;//bug1
    Q.head=Q.tail=0;
    return true;
}

int Length_SqQueue(SqQueue Q)//返回循环队列的长度
{
    return (Q.tail-Q.head+MaxQSize)%MaxQSize;
}

bool Insert_SqQueue(SqQueue& Q,QElemType e)//插入e到循环队列队尾
{
    if((Q.tail+1)%MaxQSize==Q.head)
        return false;
    Q.base[Q.tail]=e;//bug2:不应该 Q.base[Q.tail++]=e
    Q.tail=(Q.tail+1)%MaxQSize;
    return true;
}

bool Delete_SqQueue(SqQueue& Q,QElemType& e)//删除循环队列的队头数据,并用e存储
{
    if(Q.head==Q.tail)
        return false;
    e=Q.base[Q.head];//bug3:不应该 e=Q.base[Q.head++]
    Q.head=(Q.head+1)%MaxQSize;
    return true;
}

int main()
{
    SqQueue Q;
    Init_SqQueue(Q);
    Input_SqQueue(Q);
    OutPut_SqQueue(Q);
    cout<<"队列长度:"<<Length_SqQueue(Q)<<endl;
    QElemType e;
    Delete_SqQueue(Q,e);
    OutPut_SqQueue(Q);
    Insert_SqQueue(Q,e);
    OutPut_SqQueue(Q);
    Clear_SqQueue(Q);
    cout<<"”清空“后:\n";
    cout<<"其中的两个数据:"<<Q.base[0]<<" "<<Q.base[1]<<endl;
    OutPut_SqQueue(Q);
    cout<<"实际上证明原数据仍存在,只不过不能通过Q.head Q.tail找到了\n";
    Destroy_SqQueue(Q);
    cout<<"其中的两个数据:"<<Q.base[0]<<" "<<Q.base[1]<<endl;//Destroy后Q.base错误
    cout<<"证明原数据已经不存在了\n";
    return 0;
}

输入数据 非double停止
1.1
2.2
3.3
4.4
5.5
队列空间已满
队列数据:
1.1 2.2 3.3 4.4
------
队列长度:4
队列数据:
2.2 3.3 4.4
------
队列数据:

------
”清空“后:
其中的两个数据:1.1 2.2
队列数据:

------
实际上证明原数据仍存在,只不过不能通过Q.head Q.tail找到了

Process returned -1073741819 (0xC0000005)   execution time : 6.445 s
Press any key to continue.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值