数据结构——线性表——队列(queue)
队列也是一种特殊的线性表,它的特点是先入先出(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)的更多相关文章
- [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList
一.线性表 1,什么是线性表 线性表就是零个或多个数据元素的有限序列.线性表中的每个元素只能有零个或一个前驱元素,零个或一个后继元素.在较复杂的线性表中,一个数据元素可以由若干个数据项组成.比如牵手排 ...
- [数据结构-线性表1.2] 链表与 LinkedList<T>(.NET 源码学习)
[数据结构-线性表1.2] 链表与 LinkedList<T> [注:本篇文章源码内容较少,分析度较浅,请酌情选择阅读] 关键词:链表(数据结构) C#中的链表(源码) 可空类 ...
- [置顶] ※数据结构※→☆线性表结构(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)
循环队列 为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量.存储在其中的队列称为循环队列(Circular Queue). ...
- [置顶] ※数据结构※→☆线性表结构(queue)☆============队列 顺序存储结构(queue sequence)(八)
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的 ...
- [置顶] ※数据结构※→☆线性表结构(queue)☆============优先队列 链式存储结构(queue priority list)(十二)
优先队列(priority queue) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有 ...
- Java学习笔记(2)----散列集/线性表/队列/集合/图(Set,List,Queue,Collection,Map)
1. Java集合框架中的所有实例类都实现了Cloneable和Seriablizable接口.所以,它们的实例都是可复制和可序列化的. 2. 规则集存储的是不重复的元素.若要在集合中存储重复的元素, ...
- C#实现数据结构——线性表(上)
什么是线性表 数据结构中最常用也最简单的应该就是线性表,它是一种线性结构(废话,不是线性结构怎么会叫线性表?当然不是废话,古人公孙龙就说白马非马,现代生物学家也说鲸鱼不是鱼). 那什么是线性结构? 按 ...
- k:特殊的线性表—队列
队列的概念: 队列是另一种特殊的线性表,它的特殊性体现在其只允许在线性表的一端插入数据元素,在线性表的另一端删除数据元素(一般会采用在线性表的表尾那端(没被head指针所指的那端)插入数据元素,在线 ...
- 常用数据结构-线性表及Java 动态数组 深究
[Java心得总结六]Java容器中——Collection在前面自己总结的一篇博文中对Collection的框架结构做了整理,这里深究一下Java中list的实现方式 1.动态数组 In compu ...
随机推荐
- 从零一起学Spring Boot之LayIM项目长成记(三) 数据库的简单设计和JPA的简单使用。
前言 今天是第三篇了,上一篇简单模拟了数据,实现了LayIM页面的数据加载.那么今天呢就要用数据库的数据了.闲言少叙,书归正传,让我们开始吧. 数据库 之前有好多小伙伴问我数据库是怎么设计的.我个人用 ...
- Angular通过订阅观察者对象实现不同组件中数据的实时传递
在angular官方定义中,组件直接的数据交换只要在父子直接传递,但是我们在项目中经常需要在各种层级之间传递数据,下面介绍关于订阅可观察对象实现的数据传递. 首先定义一个服务app.sevice.ts ...
- 省市区/国籍 多级联动-jq
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Linux系统中svn服务器设置开机启动
安装完svn服务器后虽然好用但是因为经常重启Linux服务器,每次重启完就要去手动启动svn服务器,很是麻烦,于是在网上找了一些方法后,自己把svn服务器设置成开机启动 步骤一:安装svn服务器: h ...
- Invalid bound statement (not found)解决方法
项目背景:SSM框架,MySQL数据库 报错情况: 错误原因:Mybatis的xml文件中,namespace路径错误!!引入的不是对应的Dao接口!!! Dao接口和对应的xml文件 必须一一对应! ...
- Firefox扩展安装
firefox扩展和chrome扩展非常相似,甚至兼容.因总结过chrome扩展的开发,这里不提,本篇谈谈firefox扩展的安装. 1.打包 所谓的打包,就是压缩,利用普通的右键压缩文件夹,这样形成 ...
- Web项目生成详解
action 与用户控制层相关内容,来自用户的请求和页面跳转: dao 数据库进行增删改查操作,接口定义其中: dao.impl 将上述接口进行实现 domain 数据表都映射成java中的类,实现数 ...
- MongoDB 搭建文件存储的方案
用云的话,节省你开发成本,快速上线,数据比较安全.缺点是一旦用了他们的,形成习惯以后,数据想迁移就会比较麻烦,你会越来越依赖,而且规模上去以后价格并不低.早年自己做的话,你需要实现分布式文件系统,这个 ...
- git上传项目到github简易步骤
第一步: 在github创建仓库,创建完成进入该仓库,仓库地址如:https://github.com/winerss/wcMall格式 第二步:使用git,cd到本地项目目录下,执行git明令: g ...
- Microsoft AI - Custom Vision
概述 前几天的 Windows Developer Day 正式发布了 Windows AI Platform,而作为 Windows AI Platform 的模型定义和训练,更多还是需要借助云端来 ...