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

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

🎯目的:

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


[附加题]

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

目录
相关文章
|
4天前
|
消息中间件 存储 搜索推荐
深入理解栈和队列(二):队列
深入理解栈和队列(二):队列
39 0
|
4天前
|
存储 算法 索引
【算法与数据结构】队列的实现详解
【算法与数据结构】队列的实现详解
160 0
|
3天前
|
前端开发 JavaScript 算法
JavaScript 中实现常见数据结构:栈、队列与树
JavaScript 中实现常见数据结构:栈、队列与树
|
4天前
|
存储 编译器 C语言
数据结构——顺序队列与链式队列的实现-2
数据结构——顺序队列与链式队列的实现
数据结构——顺序队列与链式队列的实现-2
|
4天前
|
存储 C语言
数据结构——顺序队列与链式队列的实现-1
数据结构——顺序队列与链式队列的实现
数据结构——顺序队列与链式队列的实现-1
|
4天前
栈与队列理解
栈与队列理解
13 1
|
4天前
|
存储 算法
数据结构与算法 栈与队列
数据结构与算法 栈与队列
12 0
数据结构与算法 栈与队列
|
4天前
|
C++
数据结构(顺序队列 循环队列
数据结构(顺序队列 循环队列
11 0
|
4天前
|
容器
【栈与队列】栈与队列的相互转换OJ题
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
11 0
|
4天前
|
C语言
猿创征文|栈和队列OJ刷题
猿创征文|栈和队列OJ刷题