队列也是一种特殊的线性表,它的特点是先入先出(FIFO,即first in first out)。它的意思也很直观,想象一下排队买票,先排的人先买(插队是不对的,所以别去想)。它也是很常用的数据结构,比如说医院的排队等候系统用这个数据结构就很合适。那么这个数据结构该怎么写呢?

下面为队列的抽象数据结构:

typedef struct NODE {
  datatype data;
  struct NODE *next;
} node; //一般的线性表
typedef struct Queue {
  int len;           //队列长度
  node *head, *tail; //队列的头和尾
} queue;

因为这个结构需要在队尾插入元素,删除队首的元素,所以需要两个指针分别指向头和尾。

下面为队列的插入函数:

void push(queue *q, datatype e) {
  node *p = (node *)malloc(sizeof(node));
  p->data = e;
  p->next = NULL;
  if (q->head == NULL)
    q->head = p;
  if (q->tail == NULL)
    q->tail = p;
  else {
    q->tail->next = p;
    q->tail = p;
  }
  q->len++;
}

如果是空队列,就让首尾都指向刚创建的节点。否者让队尾指向新节点。

下面为删除函数:

void pop(queue *q) {
  if (isempty(q)) {
    printf("这个队列是空的。\n");
    return;
  } else {
    datatype tmp = q->head->data;
    node *p = (node *)malloc(sizeof(node));
    p = q->head;
    q->head = q->head->next;
    if (q->head == NULL)
      q->tail = NULL;
    free(p);
    q->len--;
    printf("%d\n", tmp);
  }
}

也需要判断是否为空,不为空还要判断删除后是否为空,不然队尾会变得很奇怪。

总的代码如下:

#include <stdio.h>
#include <stdlib.h>
#define datatype int
#define bool int
#define true 1
#define false 0
typedef struct NODE {
  datatype data;
  struct NODE *next;
} node; //一般的线性表
typedef struct Queue {
  int len;           //队列长度
  node *head, *tail; //队列的头和尾
} queue;
queue *initque();               //创建队列
void push(queue *, datatype); //向队尾插入数据e
void pop(queue *);              //删除队首元素并输出
bool isempty(queue *);          //判断队列是否为空
int main(void) {
  int choice;
  queue *que = (queue *)malloc(sizeof(queue));
  que = initque();
  printf("1、加入元素\n2、删除并输出元素\nq、退出\n请选择:");
  ) {
    ) {
      int tmp;
      printf("请输入要添加的元素:");
      scanf("%d", &tmp);
      push(que, tmp);
    } )
      pop(que);
    printf("1、加入元素\n2、删除并输出元素\nq、退出\n请选择:");
  }
  ;
}
queue *initque() {
  queue *q = (queue *)malloc(sizeof(queue));
  q->head = NULL;
  q->tail = NULL;
  q->len = ;
  return q;
}
void push(queue *q, datatype e) {
  node *p = (node *)malloc(sizeof(node));
  p->data = e;
  p->next = NULL;
  if (q->head == NULL)
    q->head = p;
  if (q->tail == NULL)
    q->tail = p;
  else {
    q->tail->next = p;
    q->tail = p;
  }
  q->len++;
}
void pop(queue *q) {
  if (isempty(q)) {
    printf("这个队列是空的。\n");
    return;
  } else {
    datatype tmp = q->head->data;
    node *p = (node *)malloc(sizeof(node));
    p = q->head;
    q->head = q->head->next;
    if (q->head == NULL)
      q->tail = NULL;
    free(p);
    q->len--;
    printf("%d\n", tmp);
  }
}
bool isempty(queue *q) {
  )
    return true;
  else
    return false;
}

数据结构——线性表——队列(queue)的更多相关文章

  1. [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList

    一.线性表 1,什么是线性表 线性表就是零个或多个数据元素的有限序列.线性表中的每个元素只能有零个或一个前驱元素,零个或一个后继元素.在较复杂的线性表中,一个数据元素可以由若干个数据项组成.比如牵手排 ...

  2. [数据结构-线性表1.2] 链表与 LinkedList<T>(.NET 源码学习)

    [数据结构-线性表1.2] 链表与 LinkedList<T> [注:本篇文章源码内容较少,分析度较浅,请酌情选择阅读] 关键词:链表(数据结构)    C#中的链表(源码)    可空类 ...

  3. [置顶] ※数据结构※→☆线性表结构(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)

    循环队列 为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量.存储在其中的队列称为循环队列(Circular Queue). ...

  4. [置顶] ※数据结构※→☆线性表结构(queue)☆============队列 顺序存储结构(queue sequence)(八)

    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的 ...

  5. [置顶] ※数据结构※→☆线性表结构(queue)☆============优先队列 链式存储结构(queue priority list)(十二)

    优先队列(priority queue) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有 ...

  6. Java学习笔记(2)----散列集/线性表/队列/集合/图(Set,List,Queue,Collection,Map)

    1. Java集合框架中的所有实例类都实现了Cloneable和Seriablizable接口.所以,它们的实例都是可复制和可序列化的. 2. 规则集存储的是不重复的元素.若要在集合中存储重复的元素, ...

  7. C#实现数据结构——线性表(上)

    什么是线性表 数据结构中最常用也最简单的应该就是线性表,它是一种线性结构(废话,不是线性结构怎么会叫线性表?当然不是废话,古人公孙龙就说白马非马,现代生物学家也说鲸鱼不是鱼). 那什么是线性结构? 按 ...

  8. k:特殊的线性表—队列

    队列的概念:  队列是另一种特殊的线性表,它的特殊性体现在其只允许在线性表的一端插入数据元素,在线性表的另一端删除数据元素(一般会采用在线性表的表尾那端(没被head指针所指的那端)插入数据元素,在线 ...

  9. 常用数据结构-线性表及Java 动态数组 深究

    [Java心得总结六]Java容器中——Collection在前面自己总结的一篇博文中对Collection的框架结构做了整理,这里深究一下Java中list的实现方式 1.动态数组 In compu ...

随机推荐

  1. C#密封类和密封方法--C#基础

    1.密封类 1)不是所有的类都可以继承,不能别继承的类叫做密封类.如果一个类不希望被继承.被派生可以采用关键字sealed,下面Class2不能继承Class1 Class1.cs: namespac ...

  2. 【BZOJ3884】上帝与集合的正确用法(欧拉定理,数论)

    [BZOJ3884]上帝与集合的正确用法(欧拉定理,数论) 题面 BZOJ 题解 我们有欧拉定理: 当\(b \perp p\)时 \[a^b≡a^{b\%\varphi(p)}\pmod p \] ...

  3. 【BZOJ2684】【CEOI2004】锯木厂选址(斜率优化,动态规划)

    [BZOJ2684][CEOI2004]锯木厂选址(斜率优化,动态规划) 题面 万恶的BZOJ因为权限题的原因而做不了... 我要良心的提供题面 Description 从山顶上到山底下沿着一条直线种 ...

  4. 【CJOJ2482】【POI2000】促销活动

    题面 Description 促销活动遵守以下规则: 一个消费者 -- 想参加促销活动的消费者,在账单下记下他自己所付的费用,他个人的详细情况,然后将账单放入一个特殊的投票箱. 当每天促销活动结束时, ...

  5. java 关键字final static native详解

    java 关键字native static final详解 一.final 根据程序上下文环境,Java关键字final有"这是无法改变的"或者"终态的"含义, ...

  6. 命令行更新node和npm

    Windows系统下: 查看版本的命令和Ubuntu下一样. 不同的是Windows下不能使用"n"包管理器来对NodeJS进行管理,在这里我们使用一种叫"gnvm&qu ...

  7. 性能测试-并发和QPS

    性能测试-并发和QPS 响应时间: cpu计算耗时 + cpu等待耗时 + 网络io耗时 + 磁盘io耗时 并发: 服务端并发和客户端并发不是同一个概念.客户端并发仅仅是为了模拟多用户访问,服务端并发 ...

  8. 【前端单元测试入门02】react的单元测试之Enzyme

    React项目的单元测试 React的组件结构和JSX语法,对上一章的内容来讲进行测试显得很勉强. React官方已经提供了一个测试工具库:react-dom/test-utils 只是用起来不够方便 ...

  9. 简单几步优化你的windows,加快开机速度(重装windows之后要做的几件事)

    每个人都想要让自己的系统运行得快一些,开机快一些,我就来说说我自己的经验,我使用的系统是windows8.1,当然这有些方法也适用于其他的系统,我每次重装完系统之后第一件事就是下面几步,当然重装系统之 ...

  10. 笔记:Hibernate 二级缓存

    Hibernate 包括二个级别的缓存,默认的总是启用Session级别的一级缓存,可选的 SessionFactory 级别的二级缓存,Session级别的一级缓存,但应用保存持久化实体.修改持久化 ...