数据结构与算法-queue
队列和stack类似,stack是先进后出,而queue的先进先出,也是一种特殊的线性表
基本概念
概念
队列是一种特殊的线性表
队列仅在线性表的两端进行操作
队头(Front):取出数据元素的一端
队尾(Rear):插入数据元素的一端
队列不允许在中间部位进行操作

常用操作
- 销毁队列
- 清空队列
- 进队列
- 出队列
- 获取队头元素
- 获取队列的长度
#ifndef _MY_QUEUE_H_
#define _MY_QUEUE_H_
typedef void Queue;
Queue* Queue_Create();
void Queue_Destroy(Queue* queue);
void Queue_Clear(Queue* queue);
int Queue_Append(Queue* queue, void* item);
void* Queue_Retrieve(Queue* queue);
void* Queue_Header(Queue* queue);
int Queue_Length(Queue* queue);
#endif
队列的顺序存储设计与实现
(*.h)
#ifndef __MY_SEQQUEUE_H_
#define __MY_SEQQUEUE_H_
typedef void SeqQueue;
SeqQueue* SeqQueue_Create(int capacity);
void SeqQueue_Destroy(SeqQueue* queue);
void SeqQueue_Clear(SeqQueue* queue);
int SeqQueue_Append(SeqQueue* queue, void* item);
void* SeqQueue_Retrieve(SeqQueue* queue);
void* SeqQueue_Header(SeqQueue* queue);
int SeqQueue_Length(SeqQueue* queue);
int SeqQueue_Capacity(SeqQueue* queue);
#endif
(*.c)
#include <stdio.h>
#include "seqqueue.h"
#include "seqlist.h"
//创建队列,相当于创建一个线性表
SeqQueue* SeqQueue_Create(int capacity)
{
return SeqList_Create(capacity);
}
void SeqQueue_Destroy(SeqQueue* queue)
{
SeqList_Destroy(queue);
}
void SeqQueue_Clear(SeqQueue* queue)
{
SeqList_Clear(queue);
}
//向队列中添加元素,相当于向线性表中,尾部插入元素
int SeqQueue_Append(SeqQueue* queue, void* item)
{
return SeqList_Insert(queue, item, SeqList_Length(queue));
}
//从队列中删除元素,相当于从线性表中删除第一个元素
void* SeqQueue_Retrieve(SeqQueue* queue)
{
return SeqList_Delete(queue, 0);
}
void* SeqQueue_Header(SeqQueue* queue)
{
return SeqList_Get(queue, 0);
}
int SeqQueue_Length(SeqQueue* queue)
{
return SeqList_Length(queue);
}
int SeqQueue_Capacity(SeqQueue* queue)
{
return SeqList_Capacity(queue);
}
(test)
#include <stdio.h>
#include "seqqueue.h"
void main()
{
int i, a[10];
SeqQueue *queue = NULL;
queue = SeqQueue_Create(10);
//向队列中放元素
for (i = 0; i < 10; i++)
{
a[i] = i + 1;
SeqQueue_Append(queue, &a[i]);
}
printf("the header of queue: %d \n", *((int *)SeqQueue_Header(queue)));
printf("the length of queue: %d \n", SeqQueue_Length(queue));
printf("the capacity of queue: %d \n", SeqQueue_Capacity(queue));
//删除队列
while (SeqQueue_Length(queue) > 0)
{
printf("%d \n", *((int *)SeqQueue_Retrieve(queue)));
}
SeqQueue_Destroy(queue);
system("pause");
}
队列的链式存储设计与实现
(*.h)
#ifndef __MY_LINKQUEUE_H_
#define __MY_LINKQUEUE_H_
typedef void LinkQueue;
LinkQueue* LinkQueue_Create();
void LinkQueue_Destroy(LinkQueue* queue);
void LinkQueue_Clear(LinkQueue* queue);
int LinkQueue_Append(LinkQueue* queue, void* item);
void* LinkQueue_Retrieve(LinkQueue* queue);
void* LinkQueue_Header(LinkQueue* queue);
int LinkQueue_Length(LinkQueue* queue);
#endif
(*.c)
#include <stdio.h>
#include <stdlib.h>
#include "linkqueue.h"
#include "linklist.h"
typedef struct _tag_LinkQueueNode
{
LinkListNode node;
void *item;
}TLinkQueueNode;
//创建一个队列,相当于创建一个线性表
LinkQueue* LinkQueue_Create() //O(1)
{
return LinkList_Create();
}
void LinkQueue_Destroy(LinkQueue* queue) //O(1)
{
LinkQueue_Clear(queue);
LinkList_Destroy(queue);
}
void LinkQueue_Clear(LinkQueue* queue) //O(n)
{
while (LinkQueue_Length(queue) > 0)
{
LinkQueue_Retrieve(queue);
}
//LinkQueue_Clear(queue);
}
//向队列中添加元素,相当于向队列的尾部插入元素
int LinkQueue_Append(LinkQueue* queue, void* item) //O(n)
{
int ret = 0;
TLinkQueueNode * node = NULL;
//需要向linklist中添加业务节点,需要在业务节点中包含链表结点
//需要让链表结点放在业务节点的第一个成员域。
//把形参item,转换为 linklist识别的业务节点
node = (TLinkQueueNode *)malloc(sizeof(TLinkQueueNode));
if (node == NULL)
{
return -1;
}
memset(node, 0, sizeof(TLinkQueueNode));
node->item = item;
ret = LinkList_Insert(queue, (LinkListNode *)node, LinkList_Length(queue));
if (ret != 0)
{
free(node);
return -2;
}
return ret;
}
//从队列删除元素,相当于从队列的头部拿元素
void* LinkQueue_Retrieve(LinkQueue* queue) //O(1)
{
int ret = 0;
void * item = NULL;
TLinkQueueNode *node = NULL;
//需要向linklist中添加业务节点,需要在业务节点中包含链表结点
node = (TLinkQueueNode *)LinkList_Delete(queue, 0);
if (node == NULL)
{
return NULL;
}
item = node->item;
if (node != NULL)
{
free(node);
node = NULL;
}
return item;
}
//获取队列头元素,相当于从队列0位置拿元素
void* LinkQueue_Header(LinkQueue* queue) //O(1)
{
int ret = 0;
void * item = NULL;
TLinkQueueNode * node = NULL;
node = (TLinkQueueNode *)LinkList_Get(queue, 0);
if (node == NULL)
{
return NULL;
}
item = node->item;
return item;
}
int LinkQueue_Length(LinkQueue* queue)
{
return LinkList_Length(queue);
}
(test)
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "linkqueue.h"
void main(void)
{
int i , a[10];
LinkQueue* queue = NULL;
queue = LinkQueue_Create();
//向队列中添加元素
for (i=0; i<10; i++)
{
a[i] = i + 1;
LinkQueue_Append(queue, &a[i]);
}
//
printf("the length of queue: %d \n", LinkQueue_Length(queue));
printf("the header of queue: %d \n", *((int *)LinkQueue_Header(queue)));
while (LinkQueue_Length(queue) > 0)
{
printf("%d \n", *((int *)LinkQueue_Retrieve(queue)));
}
LinkQueue_Destroy(queue);
system("pause");
}
数据结构与算法-queue的更多相关文章
- 每周一练 之 数据结构与算法(Queue)
这是第二周的练习题,这里补充下咯,五一节马上就要到了,自己的计划先安排上了,开发一个有趣的玩意儿. 下面是之前分享的链接: 1.每周一练 之 数据结构与算法(Stack) 2.每周一练 之 数据结构与 ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之队列(Queue)实现
本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...
- 【Java数据结构学习笔记之三】Java数据结构与算法之队列(Queue)实现
本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...
- Airport Simulation (数据结构与算法 – 队列 / Queue 的应用)
Airport Simulation 是数据结构与算法教材中用于演示Queue的一个小程序(大多数教师似乎会跳过这个练习).主程序会通过输入总的运行时间.队列里可以等待的最多飞机数量,平均每个时间单元 ...
- javascript数据结构与算法---队列
javascript数据结构与算法---队列 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素 ...
- php数据结构与算法
php面试题之二--数据结构和算法(高级部分) 二.数据结构和算法 1.使对象可以像数组一样进行foreach循环,要求属性必须是私有.(Iterator模式的PHP5实现,写一类实现Iterator ...
- 数据结构和算法 – 3.堆栈和队列
1.栈的实现 后进先出 自己实现栈的代码 using System; using System.Collections.Generic; using System.Linq; using ...
- php面试题之二——数据结构和算法(高级部分)
二.数据结构和算法 1.使对象可以像数组一样进行foreach循环,要求属性必须是私有.(Iterator模式的PHP5实现,写一类实现Iterator接口)(腾讯) <?php class T ...
- 面试常考的常用数据结构与算法(zz)
数据结构与算法,这个部分的内容其实是十分的庞大,要想都覆盖到不太容易.在校学习阶段我们可能需要对每种结构,每种算法都学习,但是找工作笔试或者面试的时候,要在很短的时间内考察一个人这方面的能力,把每种结 ...
随机推荐
- 【线性代数】4-3:最小二乘近似(Least Squares Approximations)
title: [线性代数]4-3:最小二乘近似(Least Squares Approximations) categories: Mathematic Linear Algebra keywords ...
- Contos 安装Tomcat
# 下载安装包 wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.40/bin/apache-tomcat-8. ...
- hdu6568 Math (概率dp)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6568 题意: 在$0$到$L$的坐标轴运输货物,在每个整数点可能丢失货物,丢失概率为$p$,丢失后可 ...
- Hadoop元数据备份与恢复方案
Hadoop元数据备份与恢复方案 标签(空格分隔): Hadoop Namenode 备份策略: 周期性备份namenode.standby namenode的dfs.namenode.name.di ...
- antd-mobile的DatePicker分钟精度半小时
项目要求,在时间选择上需要精确到分钟,且分钟只能半小时,既0分钟或者是30分钟. 前期引用的时间控件是antd-mobile的DatePicker组件,具体用法可参考:https://mobile.a ...
- Final——PowerShell Empire
一.介绍 Empire是一款针对Windows平台的.使用PowerShell脚本作为攻击载荷的渗透攻击框架工具,具有从stager生成.提权到渗透维持的一系列功能.Empire实现了无需powers ...
- ReSharper “Cannot resolve symbol” even when project builds
ReSharper “Cannot resolve symbol” even when project builds This worked for me (VS2012u4, R# 7.1.3) ...
- springboot项目的maven的pom.xml文件第一行报错 Unknown Error
springboot项目的maven的pom.xml文件第一行报错 Unknown Error https://blog.csdn.net/mini_jike/article/details/9239 ...
- Graphics 使用一点点注意
Form_Load 事件下绘制的结果会被 paint 刷新掉.也就等于没有绘制一样. Graphics g = this.CreateGraphics(); g.DrawRectangle(new P ...
- [转]Nginx实现高并发的原理
Nginx 首先要明白,Nginx 采用的是多进程(单线程) & 多路IO复用模型.使用了 I/O 多路复用技术的 Nginx,就成了”并发事件驱动“的服务器. 异步非阻塞(AIO)的详解ht ...