美文网首页
五、栈和队列(二)、队列

五、栈和队列(二)、队列

作者: 默默_David | 来源:发表于2020-05-30 23:02 被阅读0次

数据结构目录

1.定义

队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。

  • 与栈相反,队列是一种先进先出(First In First Out,FIFO)的线性表
  • 与栈相同的是,队列也是一种重要的线性结构,实现一个队列同样需要顺序表或链表作为基础
队列

2.队列的链式存储结构

队列既可以用链表实现,也可以用顺序表实现。跟栈相反的是,栈一般我们用顺序表来实现,而队列我们常用链表来实现,简称为链队列

typedef struct QNode{
    ElemType data;
    struct QNode *next;
}QNode,*QueuePtr;

typedef struct LinkQueue{
    QueuePtr front,rear;//队头、尾指针
}LinkQueue;

我们将队头指针指向链队列的头结点,而队尾指针指向终端结点。(注:头结点不是必要的,但我们加上后操作更方便)


队列

空队列时,front和rear都指向头结点

空队列

(1)创建一个队列

创建一个队列要完成两个任务:

  1. 创建头结点
  2. 将队列的头指针和尾指针都指向头结点,生成空队列
Status initQueue(LinkQueue *q){
    q->front = (QueuePtr)malloc(sizeof(QNode));
    if (!q->front) {
        return ERROR;
    }
    q->rear = q->front;
    q->rear->next = NULL;
    return OK;
}

(2) 入队列操作

入队列操作

如图所示,入队列就是在队尾插入一个新的结点

Status insertQueue(LinkQueue *q,ElemType e){
    QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
    if (!p) {
        return ERROR;
    }
    p->data = e;
    p->next = NULL;
    q->rear->next = p;
    q->rear = p;
    
    return OK;
}

(3)出队列操作

出队列操作是将队列中的第一个元素移出,队头指针不发生改变,改变头结点的next指针即可


出队列操作

如果原队列只有一个元素,那么我们就应该处理一下队尾指针,让它指向头结点


处理一个元素的情况
Status deleteQueue(LinkQueue *q,ElemType *e){
    if (q->rear == q->front) {
        //队尾和队头指向相同,表示空队列
        return ERROR;
    }
    QueuePtr p = q->front->next;
    //返回值
    *e = p->data;
    
    //头结点指向下一个元素
    q->front->next = p->next;
    if (q->rear == p) {
        //只有一个元素的队列
        q->rear = q->front;
    }
    free(p);
    return OK;
}

(4)销毁一个队列

由于链队列建立在内存的动态区,因此当一个队列不再有用时应当把它及时销毁掉,以免过多的占用内存空间

Status destroyQueue(LinkQueue *q){
    while (q->front) {
        QueuePtr p = q->front;
        q->front = q->front->next;
        free(p);
    }
    q->front = q->rear = NULL;
    return OK;
}

相关文章

  • 五、栈和队列(二)、队列

    数据结构目录 1.定义 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 与栈相反,...

  • 栈和队列

    用栈定义队列(出入栈) 用队列定义栈(数据队列和辅助队列)

  • Algorithm小白入门 -- 队列和栈

    队列和栈队列实现栈、栈实现队列单调栈单调队列运用栈去重 1. 队列实现栈、栈实现队列 队列是一种先进先出的数据结构...

  • 数据结构——栈和队列

    用数组实现栈和队列 用栈实现队列 用队列实现栈 栈和队列的经典算法题最小间距栈宠物收养所 数组实现栈和队列 用数组...

  • 栈和队列

    栈和队列 本质上是稍加限制的线性表 栈和队列定义 栈顺序栈定义 链栈结点定义 队列顺序队列 链队列链队类型定义 链...

  • 剑指Offer(五)

    剑指Offer(五) 用两个栈实现队列 题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列...

  • 算法导论 基本数据结构

    MIT公开课没有讲到的内容,介绍几种基本数据结构- 栈和队列- 链表- 二叉树 栈和队列 栈和队列都是动态集合,元...

  • Python实现栈和队列以及使用list模拟栈和队列

    Python实现栈和队列 Python使用list模拟栈和队列

  • 算法-栈和队列算法总结

    栈和队列算法总结 1 模拟 1.1 使用栈实现队列 1.2 使用队列实现栈 2 栈的应用 2.1 栈操作 2.2 ...

  • 算法分析 [BFS、Greedy贪心] 2019-02-18

    队列 和 栈 232. 用栈实现队列 Implement Queue using Stacks双栈,出队列时,将i...

网友评论

      本文标题:五、栈和队列(二)、队列

      本文链接:https://www.haomeiwen.com/subject/stkkzhtx.html