由队列和链表谈数据结构的选择

程序设计最重要的是确定程序将来完成哪些工作,以及什么工作该有什么子程序完成,这是工程由繁化简的前提。只有在确定程序将要完成的工作之后,才能确定将要采取哪种数据类型,有的语言数据类型需要自己构建,比如C,有的语言这不用。但是不是核心,核心是先确定工作,然后由工作来确定数据结构。

以《数据结构与程序设计》114页的例子来说,这是一个模拟机场飞机起飞和降落的程序。首先我们先确定这个模拟要做的工作有哪些工作:

在任意一个仿真时刻,所做的工作如下:

1,如果有飞机要降落,则先把这个飞机的数据存储在一个数据结构中。

2,如果有飞机需要起飞,则也是先把起飞的飞机数据存储在另外一个数据结构中。

3,处理起飞和降落的飞机,如果表示降落飞机的数据结构中还有数据,则先处理降落的飞机,等到降落的飞机处理完才处理起飞的飞机。

4,如果这个时刻即没有起飞的飞机,也没有降落的飞机,则用一个空闲函数来处理,记录下空闲时间

5,最后做总结。

从这几个工作中,我们来确定数据结构,首先要考虑什么地方需要构建我们自己的数据结构。飞机的数据需要构建个数据结构,还要有一个数据结构来存储许多飞机的数据。所以,在这个工作中需要构建两个数据结构。接下来要考虑的是数据结构中包含了哪些内容?先看飞机的数据Plane,这里飞机的数据应该包含飞机的id以及飞机到来的时间。所以Plane可以直接构造一个结构体,这里顺便说一句,结构体不就是自定义的数据结构吗,所以数据结构也没有那么难以理解。

然后我们来看存储飞机数据的数据结构Plane_Store,首先要考虑这个数据结构要满足实际中的什么要求,对于飞机起飞和降落,肯定是先入先出了,所以这个数据结构的原型就很容易了,应该是个队列Queue。从这我们可以看出,要选择什么样的数据结构,首先要看实际要求,由于数据结构本身就相当于存储单元,所以本质上我们看的就是数据的写入和读出的顺序以及其他的特征。接下来就是确定数据结构所需要的操作,其实很多数据结构都很相似的,包括数据的压入,数据的推出,获取数据结构的size,清除所有的数据结构。

时间: 2024-10-11 23:21:32

由队列和链表谈数据结构的选择的相关文章

浅谈数据结构系列 栈和队列

计算机程序离不开算法和数据结构,在数据结构算法应用中,栈和队列应用你比较广泛,因为两者在数据存放和读取方面效率比较高,本章节重点讲解两者的基本概念和实现. 基本概念 栈:是一种先进后出,后进先出的数据结构,本质上是线性表,只是限制仅允许在表的一段进行插入和删除工作.此端为栈顶,这是在栈中应用很关键的概念.所有数据的处理都是在栈顶进行的,进栈时,栈中元素增加,栈顶上移一位,出栈时栈顶下移一位.应用中比如:洗碗,每次洗干净的碗放在上面-进栈,取碗,从顶上取出一个-出栈:装子弹-进栈,开枪-出栈. 队

数据结构(栈,队列,链表,二叉树)

栈 栈作为一种数据结构,用途十分广泛.在回调函数等许多场景中都有应用.我们需要了解它的基本用途,那就是先进后出和队列的先进先出正好相反. 最近在学习数据结构和算法,于是自己来实现.我特别喜欢C语言的指针,我发现很好用,于是用C++来实现一个简单的范例. 主要实现就是函数就是Pop,Push Push将数据放到一个到顶层位置. Pop将数据从已有的数据中取出来. Stack.h文件,主要描述里面的数据,数据我用整形来处理,这个也可以是其他,只是示范 typedef struct mData { i

浅谈数据结构之链队列(六)

前面我们讲了队列的顺序存储结构,现在我们来看看队列的链式存储结构.队列的链式存储其实就是线性表的单链表结构,只不过它是尾进头出而已,通常我们把它简称为链队列.为了操作上的方便,我们将队头指针front指向链队列的头结点,而队尾指针rear则指向终端结点.注意:当队列为空时,指针front和rear都指向头结点. 在这里,我们再介绍一下循环队列.循环队列是为了避免数组插入与删除数据时需要移动数据而引入的,我们一般把队列的这种头尾相接的顺序存储结构称为循环队列.对于循环队列和链队列相比较来说,循环队

《啊哈算法》——栈、队列、链表

通过题目我们可以看出这篇文章将介绍什么,栈.队列.链表本质上是数据结构中的东西,通过这章的学习能够给今后数据结构的学习打下一点基础. 队列: 我们通过一个简单的谜题来引入队列的概念,给出一串9位的加密QQ号,对于这串数字,删除第一位数字,然后将第二位数字放到这串数字的最后.反复操作,直到这一串数字的所有数字都被删除.在这个过程中,按照数字删除先后顺序排列的9位数字的便是解密后的QQ号,请问解密后的QQ号是多少? 其实从数学原理的角度,这个问题并没有什么难度,非常好理解,但关键在于,如何通过程序来

算法导论第十章 栈队列和链表

本章讲述的是基本的数据结构,如栈.队列和链表.这些都是最最基本的数据结构,具体的就不再啰嗦.然后本章也没有什么需要特别注意的点,哦,有一个小节:指针和对象的实现,可以认真看一下,大概就是用其他的实现方式来代替指针和对象的实现,因为有些语言不支持指针和对象数据类型,那在实现这种链式的数据结构就无法表示,本节介绍的方法就是利用数组和数组下标来构造对象和指针,说白了,就是利用数组来表示链式对象.个人感觉意义不大,权当了解得了. 结合一些常见的笔试面试题,我就用3个习题来总结这一章吧. 1.习题10.1

浅谈数据结构-二叉树

浅谈数据结构-二叉树 二叉树是树的特殊一种,具有如下特点:1.每个结点最多有两颗子树,结点的度最大为2.2.左子树和右子树是有顺序的,次序不能颠倒.3.即使某结点只有一个子树,也要区分左右子树. 一.特殊的二叉树及特点 1.斜树 所有的结点都只有左子树(左斜树),或者只有右子树(右斜树).这就是斜树,应用较少 2.满二叉树 所有的分支结点都存在左子树和右子树,并且所有的叶子结点都在同一层上,这样就是满二叉树.就是完美圆满的意思,关键在于树的平衡. 根据满二叉树的定义,得到其特点为: 叶子只能出现

洛谷P1160 队列安排 链表

洛谷P1160 队列安排   链表 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <cstdlib> 5 #include <string> 6 #include <algorithm> 7 #include <iomanip> 8 #include <iostream> 9 using namespace std

队列(二)——队列的链表实现方式

1.队列的单向链表的实现方法 return只可以返回一个值,单向循环链表来实现队列的时候可以只保留一个指针,因为保留rear指针能够很方便的表示出front指针,所以保留rear指针. 另外由于链表的第一个结点处理比较特殊,所以在初始化的时候需要单独处理.链表实现的队列思想也是第一个单元作为头结点,不存放数据,rear指针指向的总是尾结点(在循环链表中也就是头结点的上一个结点). 2.实现方法 用带表头的单向循环链表来实现 #include <stdio.h> #include <mal

数据结构 - 简单选择排序(simple selection sort) 详解 及 代码(C++)

数据结构 - 简单选择排序(simple selection sort) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28601965 选择排序(selection sort) : 每一趟在n-i+1个记录中选取关键字最小的记录作为有序序列中第i个记录. 简单选择排序(simple selection sort) : 通过n-i次关键字之间的比较, 从n-i+1个记录中选出关键字最小的记录, 并和第i个记录交换. 选择排序需