实验内容
实现以下菜单功能,根据用户的选择调用以上各函数,检验基本操作的正确性,以备后用。除了初始化和销毁操作外,其它7个队列基本操作以及“退出”分别对应一个菜单项。初始化队列后出现该菜单,根据用户选择执行对应的队列操作,并显示结果。可循环出现菜单,直到用户选择“退出”为止,此时销毁队列,结束。
数据结构定义
算法思想及算法设计
- 利用线性表的存储结构进行队列的创建,并在queue类型中,定义了front和back,用来分别记录队头和队尾。其中,此时该线性结构为环状,当front和back相等时表示队空,当back加1等于front时表示队满。
- 以下主要描述进队、出队和求队的长度三个操作的思想。进队:首先应该判断队是否为满,若不满,将back位置放进一个新元素,并将back向后移一位,注意是逻辑后移,而不是物理后移。出队:首先应该判断队是否为空,若不空,将front位置逻辑后移一位即可完成出队。求队的长度:注意此时存储的特殊性,back加front加最大数组长度之后的和值,对最大数组长度取模,这样得到的长度才能避免为负值。
- 类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)。 | 如果数据量过大,超过了预定的最大值,程序将出现错误,而如果采用链式存储结构就没有这种问题,并且不需再考虑数据溢出的情况。 |