数据结构之——《队列》

  • 1.队列
  • 2.队列接口实现
  • 3.应用案例:用一个队列实现栈
  • 4.小结

1.队列

队列:是一种先进先出(FIFO)的线性表,允许在表的一端进行插入(即入队),在表的另一端进行删除(即出队)。
入队:队尾(rear)插入;
出队:队头(front)删除;

2.队列接口实现

(1)定义队列结构体
代码如下(示例):

typedef int QDataType;typedef struct QNode
{struct QNode* _next;QDataType _data;
}QNode;typedef struct Queue
{QNode* _front;QNode* _rear;int _size;
}Queue;

(2)队列初始化
代码如下(示例):

void queueInit(Queue* q)
{q->_front = q->_rear = NULL;q->_size = 0;
}

(3)创建结点
代码如下(示例):

QNode* creatNode(QDataType data)
{QNode* node = (QNode*)malloc(sizeof(QNode));node->_data = data;node->_next = NULL;return node;
}

(4)入队(尾插)
代码如下(示例):

void queuePush(Queue* q, QDataType data)
{QNode* node = creatNode(data);if (q->_front == NULL)q->_front = q->_rear = node;else{q->_rear->_next = node;q->_rear = node;}++q->_size;
}

(5)出队(头删)
代码如下(示例):

void queuePop(Queue* q)
{if (q->_front){QNode* next = q->_front->_next;free(q->_front);q->_front = next;//删除之后是否为空队列if (q->_front == NULL)q->_rear = NULL;--q->_size;}
}

(6)获取队尾元素
代码如下(示例):

QDataType queueBack(Queue* q)
{return q->_rear->_data;
}

(7)获取队头元素
代码如下(示例):

QDataType queueFront(Queue* q)
{return q->_front->_data;}

(8)队列的大小
代码如下(示例):

int queueSize(Queue* q)
{return q->_size;
}

(9)判断队列是否为空
代码如下(示例):

int queueEmpty(Queue* q)
{if (q->_front == NULL)return 1;return 0;
}

(10)销毁队列
代码如下(示例):

void queueDestroy(Queue* q)
{QNode* cur = q->_front;while (cur){QNode* next = cur->_next;free(cur);cur = next;}q->_front = q->_rear = NULL;q->_size = 0;
}

3.应用案例:用一个队列实现栈

根据第二部的定义实现的队列接口函数,则用队列实现栈的功能就容易多了。 入栈:队列的入队操作。 出栈:除过最后一个元素,队列中其他元素循环进行出队入队操作,最后一个元素只出队。 获取栈顶元素:队尾元素的获取。 栈是否为空:队列是否为空。

typedef struct {Queue q;
} MyStack;MyStack* myStackCreate(){MyStack* ms = (MyStack*)malloc(sizeof(MyStack));queueInit(&ms->q);return ms;
}

(1)入栈

void myStackPush(MyStack* obj, int x)
{queuePush(&obj->q, x);
}

(2)出栈

int myStackPop(MyStack* obj)
{int ret;int size = queueSize(&obj->q);while (size > 1){int front = queueFront(&obj->q);queuePop(&obj->q);queuePush(&obj->q,front);--size;}ret = queueFront(&obj->q);queuePop(&obj->q);return ret;
}

(3)获取栈顶元素

int myStackTop(MyStack* obj)
{return queueBack(&obj->q);
}

(4)栈是否为空

int myStackEmpty(MyStack* obj)
{return queueEmpty(&obj->q);
}

(5)栈释放

void myStackFree(MyStack* obj)
{queueDestroy(&obj->q);free(obj);
}

4.小结

通过学习队列线性表,对基本接口函数较为熟练掌握,而用队列实现栈,只是调用了队列的接口函数完成对应栈的操作。

数据结构之——《队列》相关推荐

  1. python链表怎么定义_Python数据结构之双向链表的定义与使用方法示例

    本文实例讲述了Python数据结构之双向链表的定义与使用方法.分享给大家供大家参考,具体如下: 和单链表类似,只不过是增加了一个指向前面一个元素的指针而已. 示意图: python 实现代码: #!/ ...

  2. Java——数据结构之双向链表

    文章目录 Java--数据结构之双向链表 1.单链表的实现 (1)定义一个节点类型 (2)头插法 (3)尾插法 (4)根据下标插入节点 (5)查找关键字 (6)删除第一次出现的关键字 (7)删除所有出 ...

  3. 图解Java数据结构之双向链表

    上一篇文章说到了单链表,也通过案例具体实现了一下,但是单链表的缺点也显而易见. 单向链表查找的方向只能是一个方向 单向链表不能自我删除,需要靠辅助节点 而双向链表则能够很轻松地实现上面的功能. 何为双 ...

  4. 数据结构实验--双向链表及其应用

    数据结构实验一: 实验要求: 1.编写使用freelist的带头.尾节点的双向链表类的定义,实现双向链表的基本操作. 2.利用双向链表实现2个一元多项式的加法和乘法运算,运算结果得到的链表要求按照指数 ...

  5. 【Java 数据结构】双向链表

    篮球哥温馨提示:编程的同时不要忘记锻炼哦! 圆圆的脑袋,大大耳朵,天天敲代码,找找找bug 目录 1.什么是双向链表 2.实现一个双向链表 2.1 实现前的约定 2.2 addFirst 方法 2.3 ...

  6. Java数据结构:双向链表的实现

    文章目录 1 双向链表 1.1 双向链表介绍 1.2 双向链表实现思路 2 双向链表实现完整代码 2.1 节点类 Student.java 2.2 双向链表实现类 StudentDoubleLinke ...

  7. [数据结构]实现双向链表

    作者: 华丞臧. 专栏:[数据结构] 各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞+收藏+关注).如果有错误的地方,欢迎在评论区指出. 文章目录 一.带头双向循环链表 二.带头双向循环链表接 ...

  8. java数据结构:双向链表结构与实现

    本教程的内容基本来自于<Java数据结构与算法> 单向链表的缺点在于每个节点只能知道自己与下一个节点,无法寻找到上一个节点.而双向链表可以解决这个问题,通过在节点内部添加一个previou ...

  9. 数据结构-带头双向链表的建立,详细教程

    前言 上一篇文章中我们学习了单链表的实现 本节将带大家学习带头双向链表的实现,希望能够对大家有一些帮助,话不多说,直接开干!! 文章目录 前言 一.带头双向链表的概念和结构 二. 带头双向链表的接口实 ...

  10. 数据结构之双向链表(Java代码)

    目录 为什么会有双向链表 单向链表的缺点 双向链表示意图 Java代码实现 为什么会有双向链表 首先要明白单链表,对单链表还比较朦胧的可以去下面的链接扫一眼. 数据结构之单链表超详细 单向链表的缺点 ...

最新文章

  1. Swift和Javascript的神奇魔法
  2. eeglab中文教程系列(5)-提取数据epoch
  3. 建环计算机应用试题,环境建环和给水排水工程计算机应用教材内容
  4. matlab imfinfo返回图像信息
  5. python图形界面库哪个好_8个必备的Python GUI库
  6. 微服务 mysql 连接池_【mysql】druid,连接池和微服务的问题
  7. Vue.js项目中,当图片无法显示时则显示默认图片
  8. 商城购物车php代码,php网上商城购物车代码一例
  9. mysql安装sql文件怎么打开_sql文件用什么打开?如何打开sql文件?
  10. freepiano 手残党也想弹钢琴(在电脑上弹奏电子钢琴自娱自乐,也许还是有点困难,不如试试freepiano+鼠标宏,这样用简谱就不怕残疾了)
  11. android gpu 视频编码,Android短视频SDK转码实践
  12. 【C/C++练习题】斐波那契数列
  13. 利用ESP8266模块制作便携WiFi杀手进行deauth攻击
  14. [EXCEL] 宏的录制、调用和删除
  15. 电商行业分析指标体系拆解下钻
  16. Springboot科学养宠 omap1计算机毕业设计-课程设计-期末作业-毕设程序代做
  17. 霍夫曼树之切割木板最小总代价问题
  18. 洛谷P1010 [NOIP1998 普及组] 幂次方 题解
  19. 海康威视SDK控制台程序consoleDemo
  20. 威盾php官网,威盾PHP加密专家解密算法

热门文章

  1. Python数值计算工具 ——Numpy(调用常用的数学和统计函数)
  2. 2016全球计算机排名,高人能否把US News 2016全球计算机专业排名发出来看看?
  3. 详解线性代数的二次型
  4. Linux下YVU420转MP4工具下载,【图片】把视频转换成mp4格式的批处理工具_bandicam吧_百度贴吧...
  5. Android语音播报、后台播报、语音识别,移动开发工程师核心竞争力
  6. PyCharm搭建Spark开发环境windows下安装pyspark
  7. MT6739 Android Q 驱动整理
  8. linux命令行下载工具
  9. au人声处理_如何用Au快速提取人声
  10. python爬大众点评手机号_Python爬虫丨大众点评数据爬虫教程(1)