关于队列的复习总结

知识图谱

这里写图片描述

1.顺序存储

队列采用数组保存,且含有数据(任意类型),队头和队尾指针(int),所以采用结构体描述。

#define MaxSize 10;//队列中元素的最大个数
typedef char ElemType;//元素类型
typedef struct{
   ElemType data[MaxSize];
   int front,rear;
}SqQuene;

循环队列

注意:在以下的循环队列中均假定front指向队头元素,rear指向队尾元素的下一个位置

在这里插入图片描述

A.初始化

void InitQueue(SqQueue &Q){
  Q.rear=Q.front=0;
}

B.判空

bool isEmpty(SqQueue Q){
  if(Q.rear==Q.front)
       return true;
   else
       return false;
}

C.入队

bool EnQueue(SqQueue &Q,Elemtype x){
  if((Q.rear+1)%MaxSize==Q.front)//队列已满
        //这里front指向队头元素,rear指向队尾元素的下一个元素
        //牺牲了一个存储单元,队列满时,rear指向的是空的存储单元
     return false;
   else
     Q.data[Q.rear]=x;
     Q.rear=(Q.rear+1)%MaxSize;
     return true;
}

D.出队

bool DeQueue(SqQueue &Q,Elemtype &x){
  if(Q.rear==Q.front)//队列为空
     return false;
   else
     x=Q.data[Q.front];
     Q.front=(Q.front+1)%MaxSize;
     return true;
}

note:
(1)初始时,rear=front=0;
(2)队空条件:rear=front;
(3)队满条件:(rear+1)%maxsize=front;
这种情况下,循环队列中有一个空单元,rear正指向它,front指向它的下一个单元;
(4)队列长度:(rear-front+maxsize)%maxsize;
(5)队列中最多有n-1个元素
(6)以上这些情况均为:front指向队头元素,rear指向队尾元素的下一个元素

2.链式存储

链式队列

front指向链首结点(一般为头节点),rear指向链尾结点。

链队包含各个结点(包括数据域和下一个指针域)和头尾指针,而头尾指针类型是结点类型。因此采用结构体定义链队,先定义结点。

typedef struct LinkNode {
  Elemtype data;
  struct LinkNode *next;
}LinkNode;//结点定义
 typedef struct{
   LinkNode *front,*rear;
}LinkQueue;//链队定义

这里写图片描述
在这里插入图片描述

tips:以下讨论关于链队的操作均建立在链队有头节点的基础上。

A.初始化

void InitQueue(LinkQueue &Q)
{
   s=(LinkNode*)malloc(sizeof(LinkNode));//申请一个结点
   Q.front=Q.rear=s;
   Q.rear->next=null;
}

B.判队空

bool IsEmpty(LinkQueue Q)
{
  if(Q.front==Q.rear)
     return true;
  else
     return false;
}

C.入队

void EnQueue(LinkQueue &Q,Elemtype x)
{
    p=(LinkNode*)malloc(sizeof(LinkNode));//申请一个结点
    p->data=x;
    p->next=null;
    Q.rear->next=p;//插入链尾
    Q.rear=p;//使p成为新的尾指针
}

D.出队

bool DeQueue(LinkQueue &Q,Elemtype &x)
{
  if(Q.front==Q.rear)//先判断链队是否为空
     return false;
   else
     p=Q.front->next;//找到队首结点
     x=p->data;//将队首结点的值读出
     Q.front->next=p->next;//删除队首结点
     if(Q.rear==p)//队列中只有一个结点时,修改尾指针
         Q.rear=Q.front;
      free(p);//释放p空间
      return true;
}

note:
(1)初始时,rear=front=新节点;
(2)由于是链队,入队时不需判断队列是否已满;
(3)出队时需要判断队列是否为空,当删除的结点是链队尾结点时,需要修改尾指针。

3.双端队列

允许两端都可以进行入队和出队操作的队列。

在这里插入图片描述
关于队列的其它遗留问题见:https://blog.csdn.net/pilgrim_121/article/details/88550400

发布了28 篇原创文章 · 获赞 13 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/pilgrim_121/article/details/79498513