【数据结构】队列的基本操作的实现

通信工程的小伙伴请看文章使用说明

实验内容

实现以下菜单功能,根据用户的选择调用以上各函数,检验基本操作的正确性,以备后用。除了初始化和销毁操作外,其它7个队列基本操作以及“退出”分别对应一个菜单项。初始化队列后出现该菜单,根据用户选择执行对应的队列操作,并显示结果。可循环出现菜单,直到用户选择“退出”为止,此时销毁队列,结束。

数据结构定义

在这里插入图片描述

算法思想及算法设计

  1. 利用线性表的存储结构进行队列的创建,并在queue类型中,定义了front和back,用来分别记录队头和队尾。其中,此时该线性结构为环状,当front和back相等时表示队空,当back加1等于front时表示队满。
  2. 以下主要描述进队、出队和求队的长度三个操作的思想。进队:首先应该判断队是否为满,若不满,将back位置放进一个新元素,并将back向后移一位,注意是逻辑后移,而不是物理后移。出队:首先应该判断队是否为空,若不空,将front位置逻辑后移一位即可完成出队。求队的长度:注意此时存储的特殊性,back加front加最大数组长度之后的和值,对最大数组长度取模,这样得到的长度才能避免为负值。
  3. 类C语言算法与实验代码中基本操作的实现基本一致,此处不再赘述。

实验代码

#include<iostream>
#include<string>
using namespace std;
typedef int Qelemtype;
typedef int Status;
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef struct
{
    int front;
    int back;
    Qelemtype *data;
}queue;
Status initqueue(queue&q)
{
    q.data=new Qelemtype[MAXSIZE];
    if(!q.data)
        exit(0);
    q.front=0;
    q.back=0;
    return OK;
}
Status isempty(queue q)
{
    system("cls");
    if(q.back==q.front)
    {
        cout<<"队空!"<<endl;
        system("pause");
        return OK;
    }
    else
    {
        cout<<"队不空!"<<endl;
        system("pause");
        return ERROR;
    }
    
}
Status inqueue(queue&q/*,Qelemtype e*/)
{
    system("cls");
    cout<<"请输入一个数字元素:";
    Qelemtype e;
    cin>>e;
    if((q.back+1)%MAXSIZE==q.front)
    {
        return ERROR;
    }
    else
    {
        q.data[q.back]=e;
        q.back=(q.back+1)%MAXSIZE;
        cout<<"入队成功!"<<endl;
        system("pause");
        return OK;
    }
}
Status outqueue(queue&q/*,Qelemtype&e*/)
{
    system("cls");
    Qelemtype e;
    if(isempty(q))
    	return ERROR;
    else
    {
        e=q.data[q.front];
        q.front=(q.front+1)%MAXSIZE;
        cout<<"出队成功!"<<endl;
        system("pause");
        return OK;
    }
}
Status getlength(queue q)
{
    system("cls");
    cout<<(q.back-q.front+MAXSIZE)%MAXSIZE<<endl;
    system("pause");
    return OK;
}
Status getfront(queue&q)
{
    system("cls");
    if(!isempty(q))
    cout<<"队头元素为:"<<q.data[q.front]<<endl;
    system("pause");
    return OK;
}
Status destroyqueue(queue&q)
{
    free(q.data);
    q.front=-1;
    q.back=-1;
    return OK;
}
Status clearqueue(queue&q)
{
    system("cls");
    q.back=q.front=0;
    cout<<"清空完成!"<<endl;
    system("pause");
    return OK;
}
void queuetraverse(queue q)
{
    system("cls");
    cout<<"队列元素为:";
    Qelemtype x;
    while(q.front%MAXSIZE!=q.back)
    {
        x=q.data[q.front];
        q.front=(q.front+1)%MAXSIZE;
        cout<<x<<' ';
    }
    system("pause");
}
void menu (queue&q)
{
    while(1)
    {
        int x;

        cout<<"1.数据入队"<<endl;
        cout<<"2.数据出队"<<endl;
        cout<<"3.获取队长度"<<endl;
        cout<<"4.获取队头元素"<<endl;
        cout<<"5.依次输出队列元素"<<endl;
        cout<<"6.判断队列是否为空"<<endl;
        cout<<"7.队列置空"<<endl;
        cout<<"0.退出系统"<<endl<<endl;
        
        cout<<"请输入选项:";
        cin>>x;
        switch(x)
        {
            case 1:inqueue(q);break;
            case 2:outqueue(q);break;
            case 3:getlength(q);break;
            case 4:getfront(q);break;
            case 5:queuetraverse(q);break;
            case 6:isempty(q);break;
            case 7:clearqueue(q);break;
            case 0:exit(0);
        }
        system("cls");
    }
}
int main()
{
    queue q;
    initqueue(q);
    menu(q);
    return 0;
}

分析与总结

优点缺点
由于使用的是线性表类型的存储结构,在读取数据的时候很方便,时间复杂度是O(1)。如果数据量过大,超过了预定的最大值,程序将出现错误,而如果采用链式存储结构就没有这种问题,并且不需再考虑数据溢出的情况。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值