🎃Hello,大家好,今天我们要做的是队列的基本操作。
🎯目的:
1、掌握队列的顺序表示和实现(循环队列)。
2、掌握队列的链式表示和实现。
🎯内容:
1、队列的顺序表示和实现(循环队列)。
2、队列的链式表示和实现。
🎯环境:
TC或VC++。
🎯步骤
1.队列的顺序表示和实现(循环队列)
编写一个程序实现顺序队列的各种基本运算,并在此基础上设计一个主程序,完成如下功能:
- 循环队列初始化:front=rear=0;
- 入队操作:rear=(rear+1)%size;
- 出队操作:front=(front+1)%size;
- 判断是否为空队列:front==rear;//程序中的if语句体现,没有单独写一个函数
- 判断队列是否已满:front=(rear+1)%size;//程序中的if语句体现,没有单独写一个函数
(6)遍历队列各元素。
要求:采用空闲一个位置的方式,即N个元素空间的循环队列最多只能存放N-1个有效元素。
循环队列结构定义:
typedef struct SqQueue
{
QElemType *base;
int front;//头指针
int rear;//尾指针
}SqQueue,*SqQueuePtr;
程序:
#include "iostream"
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXSIZE 100
typedef char QElemType;
typedef char SElemType;
typedef int Status;
typedef struct{//循环队列的构建
QElemType *base;
int front;
int rear;
}SqQueue;
int tag=0;
Status InitQueue(SqQueue &Q){//循环队列的初始化
Q.base=new QElemType[MAXSIZE];
if(!Q.base)
exit(OVERFLOW);
Q.front=Q.rear=0;
return OK;
}
Status EnQueue(SqQueue &Q,QElemType e){//循环队列的入队
if((Q.rear+1)%MAXSIZE==Q.front)//判断是否为满
return ERROR;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXSIZE;
return OK;
}
Status DeQueue(SqQueue &Q,QElemType &e){//循环队列的出队
if(Q.front==Q.rear)//判断是否为空
return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
return OK;
}
void QueueTraverse(SqQueue Q){//遍历各元素
int p=Q.front;
if(Q.front==Q.rear)
cout<<"队列已空"<<endl;
else{
cout<<"队列元素为:"<<endl;
while(p!=Q.rear){
cout<<Q.base[p]<<" ";
p=(p+1)%MAXSIZE;
}
}
cout<<endl;
}
int main(){
int choose;
SqQueue Q;
QElemType e;
cout<<"1.初始化\n";
cout<<"2.入队\n";
cout<<"3.出队\n";
cout<<"4.遍历队列\n";
cout<<"5.判断队列是否为空\n";
cout<<"6.判断队列是否为满\n";
cout<<"0.退出\n";
choose=-2;
while(choose!=0){
cout<<"请输入你的选择:";
cin>>choose;
switch(choose){
case 1:
if(InitQueue(Q)){
cout<<"初始化已成功"<<endl;
}
else
cout<<"初始化失败"<<endl;
break;
case 2:
cout<<"请输入您要入队的字符(单个字符): ";
cin>>e;
if(EnQueue(Q,e)){
cout<<"入队成功"<<endl;
}
else
cout<<"入队失败"<<endl;
break;
case 3:
if(DeQueue(Q,e)){
cout<<"出队的元素为:";
cout<<e<<endl;
}
else
cout<<"出队失败,对列已空"<<endl;
break;
case 4:
QueueTraverse(Q);
break;
case 5:
if(Q.front==Q.rear)
cout<<"该队列为空"<<endl;
else
cout<<"该队列不为空"<<endl;
break;
case 6:
if((Q.rear+1)%MAXSIZE==Q.front)
cout<<"该队列为满"<<endl;
else
cout<<"该队列没有满"<<endl;
case 0:
cout<<"退出成功";
break;
default:
"输入错误,请重新输入";
}
}
}
2.队列的链式表示和实现
编写一个程序实现链式队列的各种基本运算,并在此基础上设计一个主程序,完成如下功能:
队列的链式存储结构定义
typedef struct LinkNode{
ELEMTYPE data;
struct LinkNode *next;
}LinkNode;
typedef struct{
LinkNode *front,*rear;
}LinkQuene;
- 初始化
- 判空
- 入队
- 出队
(5) 队列的遍历
程序:
#include "iostream"
using namespace std;
#define OK 1
#define ERROR 0
typedef int Status;
typedef char QElemType;
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue &Q){//初始化
Q.front=Q.rear=new QNode;
Q.front->next=NULL;
return OK;
}
Status QueueEmpty(LinkQueue Q){//判空
if(Q.front==Q.rear)
return ERROR;
return OK;
}
Status EnQueue(LinkQueue &Q,QElemType e){//入队
QueuePtr p;
p=new QNode;
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return OK;
}
Status DeQueue(LinkQueue &Q,QElemType &e){//出队
if(Q.rear==Q.front)
return ERROR;
QueuePtr p;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front;
delete p;
return OK;
}
Status TraverseQueue(LinkQueue Q){//队列的遍历
if(Q.rear==Q.front){
cout<<"队为空"<<endl;
return ERROR;
}
QueuePtr s=Q.front->next;
cout<<"队中元素为: ";
while(s){
printf("%-3c ",s->data);
s=s->next;
}
cout<<endl;
return OK;
}
int main(){
LinkQueue Q;
int choose;
QElemType e;
cout<<"1.初始化\n"<<endl;
cout<<"2.判空\n"<<endl;
cout<<"3.入队\n"<<endl;
cout<<"4.出队\n"<<endl;
cout<<"5.队列的遍历\n"<<endl;
cout<<"0.退出\n"<<endl;
choose=-1;
while(choose){
cout<<"请输入你的选择:";
cin>>choose;
switch(choose){
case 1:
if(InitQueue(Q))
cout<<"初始化成功"<<endl;
else
cout<<"初始化失败"<<endl;
break;
case 2:
if(QueueEmpty(Q))
cout<<"队列为不空"<<endl;
else
cout<<"队列为空"<<endl;
break;
case 3:
cout<<"请输入要插入的字符(单个字符):";
cin>>e;
if(EnQueue(Q,e))
cout<<"入队成功"<<endl;
else
cout<<"入队失败"<<endl;
break;
case 4:
if(DeQueue(Q,e))
cout<<"出队元素为"<<e<<endl;
else
cout<<"队为空"<<endl;
break;
case 5:
TraverseQueue(Q);
break;
case 0:
cout<<"退出成功"<<endl;
break;
deflaut:
cout<<"输入错误,请重新输入!"<<endl;
}
}
}
[附加题]
- (必做)假设以数组Q[m]存放循环队列中的元素,同时设置一个标志tag,以tag= 0 和tag= 1来区别在队头指针(front)和队尾指针(rear)相等时,队列状态为“空” 还是“满"。试编写与此结构相应的插入(Enqueue) 和删除(Dequeue) 算法。
🎃以上是本期的所有内容了,请大佬多多在评论区指正!
🌞我是IT闫,期待你的关注!!!❤️