队列和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的更多相关文章

  1. 每周一练 之 数据结构与算法(Queue)

    这是第二周的练习题,这里补充下咯,五一节马上就要到了,自己的计划先安排上了,开发一个有趣的玩意儿. 下面是之前分享的链接: 1.每周一练 之 数据结构与算法(Stack) 2.每周一练 之 数据结构与 ...

  2. 【Java数据结构学习笔记之二】Java数据结构与算法之队列(Queue)实现

      本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...

  3. 【Java数据结构学习笔记之三】Java数据结构与算法之队列(Queue)实现

      本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...

  4. Airport Simulation (数据结构与算法 – 队列 / Queue 的应用)

    Airport Simulation 是数据结构与算法教材中用于演示Queue的一个小程序(大多数教师似乎会跳过这个练习).主程序会通过输入总的运行时间.队列里可以等待的最多飞机数量,平均每个时间单元 ...

  5. javascript数据结构与算法---队列

    javascript数据结构与算法---队列 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素 ...

  6. php数据结构与算法

    php面试题之二--数据结构和算法(高级部分) 二.数据结构和算法 1.使对象可以像数组一样进行foreach循环,要求属性必须是私有.(Iterator模式的PHP5实现,写一类实现Iterator ...

  7. 数据结构和算法 – 3.堆栈和队列

    1.栈的实现   后进先出     自己实现栈的代码 using System; using System.Collections.Generic; using System.Linq; using ...

  8. php面试题之二——数据结构和算法(高级部分)

    二.数据结构和算法 1.使对象可以像数组一样进行foreach循环,要求属性必须是私有.(Iterator模式的PHP5实现,写一类实现Iterator接口)(腾讯) <?php class T ...

  9. 面试常考的常用数据结构与算法(zz)

    数据结构与算法,这个部分的内容其实是十分的庞大,要想都覆盖到不太容易.在校学习阶段我们可能需要对每种结构,每种算法都学习,但是找工作笔试或者面试的时候,要在很短的时间内考察一个人这方面的能力,把每种结 ...

随机推荐

  1. 读取根目录src下的指定配置properties文件内容

    代码如下: package com.chen.system.util; import java.io.File; import java.io.FileInputStream; import java ...

  2. 建造者模式(Builder)---创建型

    1 定义域特征 定义:将一个复杂的对象构建与其表示分离,使得同样的构建过程可以创建不同的表示.特征:用户只需要指定需要建造的类型即可,对于中间的细节不考虑. 本质:分离整体构建算法和部件构造.构建一个 ...

  3. 2 MVC设计模式

    0 基础知识 (1)B/S与C/S结构 C/S(客户机/服务器 client/service):分为客户机和服务器两层,应用软件安装在客户端通过网络与服务器通信 B/S(liulanq/服务器 bro ...

  4. SQL Server Dead Lock Log

    1 . 模拟Dead Lock Session1: begintran insertintoT1(name)values('test1') UpdateT2setname='test1' commit ...

  5. Prime Path (POJ - 3126 )(BFS)

    转载请注明出处:https://blog.csdn.net/Mercury_Lc/article/details/82697622     作者:Mercury_Lc 题目链接 题意:就是给你一个n, ...

  6. Java 显示锁 之 队列同步器AQS(六)

    1.简述 锁时用来控制多个线程访问共享资源的方式,一般情况下,一个锁能够防止多个线程同时访问共享资源.但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁. 在Java 5.0之前,在协调对共享对 ...

  7. elasticsearch-head后台运行

    运行插件 # npm run start > elasticsearch-head@0.0.0 start /usr/local/elasticsearch-head-master > g ...

  8. Leetcode题目226.翻转二叉树(简单)

    题目描述: 翻转一颗二叉树 示例: 输入: 4 / \ 2 7 / \ / \ 1 3 6 9 输出: 4 / \ 7 2 / \ / \ 9 6 3 1 思路分析: 1)递归,不断交换左右子树,直到 ...

  9. dubbo服务层面上的负载均衡和高可用

    dubbo上的服务层可以做集群,来达到负载均衡和高可用,很简单,只需要在不同的服务器节点上向同一个zk(内网环境)注册相同的服务 注意就是,消费者不能在同一个zk做这种集群操作的 转载请注明博客出处: ...

  10. Qt控制台输出QString

    有时候想在控制台输出我们想要的QString变量. 1.qDebug可以实现在控制台终端打印,但我们还是想使用C++中的std::cout<<variable This function ...