数据结构— — 队列的基本操作

  🎃Hello,大家好,今天我们要做的是队列的基本操作。



🎯目的:

1、掌握队列的顺序表示和实现(循环队列)。

2、掌握队列的链式表示和实现。


🎯内容:

1、队列的顺序表示和实现(循环队列)。

2、队列的链式表示和实现。


🎯环境:

TC或VC++。


🎯步骤

1.队列的顺序表示和实现(循环队列)

编写一个程序实现顺序队列的各种基本运算,并在此基础上设计一个主程序,完成如下功能:

  1. 循环队列初始化:front=rear=0;

  1. 入队操作:rear=(rear+1)%size;

  1. 出队操作:front=(front+1)%size;

  1. 判断是否为空队列:front==rear;//程序中的if语句体现,没有单独写一个函数

  1. 判断队列是否已满: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;
  1. 初始化

  1. 判空

  1. 入队

  1. 出队

(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;           

       }

  }

}

[附加题]

  1. 必做)假设以数组Q[m]存放循环队列中的元素,同时设置一个标志tag,以tag= 0 和tag= 1来区别在队头指针(front)和队尾指针(rear)相等时,队列状态为“空” 还是“满"。试编写与此结构相应的插入(Enqueue) 和删除(Dequeue) 算法。


 🎃以上是本期的所有内容了,请大佬多多在评论区指正!

 🌞我是IT闫,期待你的关注!!!❤️

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Y小夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值