当前位置:   article > 正文

队列的顺序、链式表示与实现_1. 创建队列的接口。 2. 队列的顺序实现。 3. 队列的链式实现。 4. 用队列求解素

1. 创建队列的接口。 2. 队列的顺序实现。 3. 队列的链式实现。 4. 用队列求解素

       上期说到栈,是一种“先进后出”的线性表,今天我们来剖析一下一种 “ 先进先出 ” 的数据结构:队列。

队列也有顺序表示和链式表示。

一、队列的顺序表示

1.队列的顺序存储结构

   队列同样需要用头(head)尾(tail)指针

  1. #define MAXSIZE 100
  2. typedef struct{
  3. qelemType *base;//循环队列存储的基地址
  4. int head;//头指针
  5. int tail;//尾指针
  6. }sqQueue;

2.初始化

(1)为队列动态分配一个大小为MAXSIZE的数组空间

(2)base指向数据空间的首地址

(3)头尾指针置0

  1. #define status int
  2. #define qelemType int
  3. status init_Queue(sqQueue &Q){
  4. Q.base=new qelemType[MAXSIZE];
  5. if(!Q.base)
  6. return 0;
  7. Q.head=Q.tail=0;
  8. return 1;
  9. }

3.获得队列长度

(1)对于非循环队列,头尾指针差值即为长度

(2)对于循环队列,差值可能<0,故差值加上MAXSIZE后在对MAXSIZE求余

        Eg:head=5;tail=1;MAXSIZE=10;(head-tail)= -4;

               进行上述操作得:length=6

  1. int queue_Length(sqQueue Q){
  2. return(Q.tail-Q.head+MAXSIZE)%MAXSIZE;
  3. }

4.入队

(1)判断队列是否满队

(2)将新元素插入队尾

(3)队尾指针+1

  1. status queue_Insert(sqQueue &Q,qelemType e){
  2. if((Q.tail+1)%MAXSIZE==Q.head)
  3. return 0;
  4. Q.base[Q.tail]=e;
  5. Q.tail=(Q.tail+1)%MAXSIZE;
  6. return 1;
  7. }

5.出队

(1)判断队列是否满队

(2)保存队头(head)

(3)队头指针+1

  1. status queue_Delete(sqQueue &Q,qelemType &e){
  2. if(Q.head==Q.tail)
  3. return 0;
  4. e=Q.base[Q.head];
  5. Q.head=(Q.head+1) %MAXSIZE;
  6. return 1;
  7. }

6.取队头元素

(1)判断队列是否为空,若不为空,执行一下操作

         返回队头元素的值,头指针不变

  1. #define selemType int
  2. selemType get_Queue_Head(sqQueue Q){
  3. if(Q.head!=Q.tail)
  4. return Q.base[Q.head];
  5. }

当用户无法提前获知队列的最大长度时,应采用队列的链式结构

二、队列的链式表示(通常用单链表表示)

注:与栈的链式存储表示不同的是,队列的链式表示需要两组指针

1.队列的链式存储结构

  1. #define qelemType int
  2. #define queuePointer int
  3. typedef struct{
  4. qelemType data;//节点数据域
  5. struct QNode *next;//节点指针域
  6. }QNode,*queuePointer;//queuePointer为指向qNode结构的指针类型
  7. typedef struct{
  8. queuePointer head;//头指针
  9. queuePointer tail;//尾指针
  10. }queueLink;

2.初始化

(1)生成一个新的节点作为头结点

(2)队头与队尾指向这个新节点

(3)头结点指针域置空

  1. #define status int
  2. status init_Link_Queue(queueLink &Q){
  3. Q.head=Q.tail=new QNode;
  4. Q.head->next=NULL;//置空
  5. return 1;
  6. }

3.入队

(1)用指针p指向即将入队的元素 并 动态分配内存空间

(2)新节点的数据域置为e

(3)将新节点插入到队尾

(4)将队尾指针修改为p

  1. status link_Queue_Insert(queueLink &Q,qelemType e){
  2. queueLink p=new QNode;
  3. p->data=e;
  4. p->next=NULL;
  5. Q.head->next=p;
  6. Q.head=p;
  7. return 1;
  8. }

4.出队

(1)判断队列是否为空

(2)保存队头元素的内存空间

(3)修改头节点的指针域,使其指向像一个节点

(4)判断出队元素是否为最后一个,若是,将尾指针重新赋值并指向头结点;若否(5)

(5)释放保存的队头元素的内存空间

  1. status link_Queue_Delete(queueLink &Q,qelemType &e){
  2. queueLink p;
  3. if(Q.head==Q.tail)
  4. return 0;
  5. p=Q.head->next;
  6. e=p->data;
  7. Q.head->next=p->next;
  8. if(Q.head==p)
  9. Q.head=Q.tail;
  10. delete p;
  11. retunr 1;
  12. }

5.取队头元素

(1)判断队列是否为空,若否(2)

(2)返回当前队头元素的value,队头指针不变

  1. #define selemType int
  2. selemType get_Link_Queue_Head(queueLink Q){
  3. if(Q.head!=Q.tail)
  4. return Q.head->next->data;
  5. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/551911
推荐阅读
相关标签
  

闽ICP备14008679号