数据结构和算法学习第3天:队列的相关知识

本文详细介绍了队列这一数据结构,包括链队列和循环队列的实现方式。队列遵循先进先出的原则,常用于作业排队等场景。链队列通过链式映象构造,循环队列利用顺序映象实现,文中还提供了各种操作如初始化、插入和删除的算法示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       队列是一种先进先出的线性表,只能在表头删除在表尾插入,操作系统中的作业排队就是队列的一个很好的应用。也有可以在两端均可进行插入和删除操作的队列,称为双端队列,但其用处并没有一般队列广泛。

 

 

队列类型的实现

1:链队列——链式映象:

2:循环队列——顺序映象

 

 

第一部分:链队列——链式映象

算法1:队列的数据结构

typedefstruct QNode {// 结点类型

    QElemType   data;

    struct QNode  *next;

  } QNode, *QueuePtr;

 

typedefstruct { // 链队列类型

    QueuePtr front;  // 队头指针

    QueuePtr rear;   // 队尾指针

} LinkQueue

空队列的判断条件是:Q.front==Q.rear

 

算法2:InitQueue(&Q):操作结果:构造一个空队列Q。

StatusInitQueue (LinkQueue &Q) {

// 构造一个空队列Q

 Q.front = Q.rear=(QueuePtr)malloc(sizeof(QNode));

 if (!Q.front) exit (OVERFLOW);                                                              

 Q.front->next = NULL;

 return OK;}

 

算法3:为队列插入元素为新的队尾元素

StatusEnQueue (LinkQueue &Q, QElemType e)

 { // 插入元素e为Q的新的队尾元素

    p = (QueuePtr) malloc (sizeof (QNode));

    if (!p) exit (OVERFLOW);

    p->data = e;   p->next = NULL;

    Q.rear->next = p;    Q.rear = p;

return OK;}

 

 

 

 

算法4:DeQueue(&Q, &e) 操作结果:删除Q的队头元素,并用e返回其值。

初始条件:Q为非空队列。

Status DeQueue (LinkQueue &Q,QElemType &e)

{// 若队列不空,则删除Q的队头元素,

 //用 e 返回其值,并返回OK;否则返回ERROR

  if (Q.front == Q.rear)    returnERROR;

  p = Q.front->next;   e = p->data;

  Q.front->next = p->next;

  if (Q.rear = = p)  Q.rear =Q.front;

  free (p);      return OK;

 

第二部分:循环队列——顺序映象

(1)用一组地址连续的存储单元依次存放从队头到队尾的元素,同时附设两个指针front 和rear分别指示队头元素和队尾元素的位置。

(2)当队列为空时:front=rear=0

(3)当插入元素时:队尾指针增加1;

(4)当删除元素时:队头指针增加1;

(5)因此:队头指针始终指向队头元素;而队尾指针始终指向队尾元素的下一位置。

算法1:队列的数据结构

#define MAXQSIZE  100  //最大队列长度

   typedef struct {

    QElemType *base;  // 动态分配存储空间

    int front;     // 头指针,若队列不空,

                   //  指向队列头元素

    int rear;      // 尾指针,若队列不空,指向

                   // 队列尾元素 的下一个位置

 } SqQueue

 

判断队满的方法:

1、设一个标志位;

2、浪费一个元素空间,约定队列头指针在队尾指针的下一位置时,表示队列满即:

(Q.rear+1) % MAXQSIZE = = Q.front是队满的判断条件

(Q.rear+1) mod maxsize=Q.front

算法2:创造一个新的队列

Status InitQueue (SqQueue &Q)

 { // 构造一个空队列Q

 Q.base = (ElemType *) malloc(MAXQSIZE *sizeof (ElemType));

 if (!Q.base) exit (OVERFLOW);  // 存储分配失败

 Q.front = Q.rear = 0;      //队空的条件即

  return OK;           (Q.front ==Q.rear )

 }

算法3:队列插入元素

Status EnQueue (SqQueue&Q,  ElemType e)

 {   // 插入元素e为Q的新的队尾元素

 if ((Q.rear+1) % MAXQSIZE = = Q.front)

 return ERROR; //队列满

 Q.base[Q.rear] = e;

 Q.rear = (Q.rear+1) % MAXQSIZE;

 return OK;

 }

算法4:队列插入删除元素

Status DeQueue (SqQueue &Q,ElemType &e)

{ // 若队列不空,则删除Q的队头元素,

  // 用e返回其值,并返回OK;  否则返回ERROR

if (Q.front == Q.rear)  return ERROR;

e = Q.base[Q.front];

Q.front = (Q.front+1) % MAXQSIZE;

return OK;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值