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

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

🎯目的:

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) 算法。

相关文章
|
2月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
284 9
|
12天前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
128 75
|
3月前
|
缓存 算法 调度
数据结构之 - 双端队列数据结构详解: 从基础到实现
数据结构之 - 双端队列数据结构详解: 从基础到实现
136 5
|
12天前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
34 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
|
12天前
|
存储 C语言 C++
【C++数据结构——栈与队列】链栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现链栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储整数,最大
35 9
|
12天前
|
C++
【C++数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】
【数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】(1)遇到左括号:进栈Push()(2)遇到右括号:若栈顶元素为左括号,则出栈Pop();否则返回false。(3)当遍历表达式结束,且栈为空时,则返回true,否则返回false。本关任务:编写一个程序利用栈判断左、右圆括号是否配对。为了完成本关任务,你需要掌握:栈对括号的处理。(1)遇到左括号:进栈Push()开始你的任务吧,祝你成功!测试输入:(()))
29 7
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
87 5
|
2月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
3月前
初步认识栈和队列
初步认识栈和队列
68 10
|
3月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
39 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列

热门文章

最新文章