`
明日天涯
  • 浏览: 35461 次
  • 性别: Icon_minigender_1
  • 来自: 福州
文章分类
社区版块
存档分类
最新评论

关于栈和队列的一些思考

阅读更多
    首先,我想就数据结构的概念做一个陈述,这样便于我们从大局上对一些具体的数据结构进行把握。所谓数据结构,是指数据元素(或称之为数据对象)的集合以及元素之间的相互关系(需要注意的是,这里的“关系”所包含的含义是比较广的,包括元素位置上的关系、元素所携带的value在大小上的关系等等)。元素之间的相互关系是数据集合的逻辑结构,而这种逻辑结构在具体的存储空间中的表达则称之为数据集合的存储结构(或物理结构)。总的来说,对于一个数据结构,我们必须对它有两个维度上的理解,一个是它的逻辑结构是什么样子的,另一个就是它可以用什么样的物理存储结构来实现。
   
    从大体上来讲,数据结构可分为线性结构和非线性结构。线性结构的特点是数据元素之间呈现一种线性关系。这里,我们引入一个概念,那就是“线性表”,线性表是最简单、最基本、也是最常用的一种线性结构。它有两种存储方法:顺序存储和链式存储。数组则是作为线性表的顺序存储的代表,那么链式存储的代表呢?那当然是链表了。基于上面所讨论的,个人认为可以采用分层的思想来理解数据结构,大体上而言,一种数据结构可分为物理层和逻辑层。数组和链表都属于物理层上的数据结构,它们在逻辑层上的性质我们暂且不去讨论。
   
    接着,我们就要引出本文所要讨论的两大主角了,栈与队列。前面谈到了线性表,那么本文的主角跟线性表究竟是什么关系呢?实际上,栈与队列的逻辑结构和线性表是相同的,都是线性结构,只是它们在对所包含的元素的操作上有所限制。栈按“后进先出”的规则进行操作,队列按“先进先出”的规则进行操作,所以可称之为操作受限的线性表。

    对于栈,我想大家应该都不会陌生,即便是在现实生活中我们也见过不少栈结构的东西,比如弹匣,我想我们应该都在电影或者现实生活中见过的。实际上,弹匣就是一种栈结构的东西,我们在脑海中试想一下,弹匣中首先被发射的子弹是最先进去的还是最后进去的。如果有人回答是最先进去的,那么我想,这个人该回家好好地看看警匪片了,呵呵。好了,那么,我想以后大家在提到栈时,脑海中就会冒出弹匣的图像了。对于栈,大家该记住的一点就是“后进先出”。还有,要提到的一点就是,栈可以理解为是逻辑层的数据结构,它的物理层可以由数组和链表来实现,也就是说,它可以有顺序存储和链式存储两种存储方式。关于栈的其它一些属性和特点,在这里我们就不再讨论了。在这里,我想讨论的是,关于栈的一些稍微深入一点的问题,另外还有一些个人的理解和思考。首先,大家是否想过一点,栈是动态的一种数据结构,而数组则是呈静态的,因为数组一旦被创建,就没法改变它的大小了。既然这样,那么,用数组是如何实现栈的呢?实际上,用数组实现栈时,栈的动态性是通过top指针来实现的,而数组自身的性质并没有变。甚至在弹栈后,数组中的元素也并没有改变,我们所做的操作只是将top指针往前移了一个数组单元。压栈时,我们是将top指针往后移了一个数组单元,然后用即将压入的元素覆盖掉原先存放于该数组单元的元素。top指针所存放的地址实际上也只需是数组的下标就可以了。与此同理的是,数组对于队列的实现。接着,我想引入几个问题,我们可以一起思考一下(答案的提示我将在文章的末尾给出):
(1)如何用一个数组来实现两个栈,使得两个栈中的元素总数不到n时,两者都不会发生上溢。注意push和pop操作的时间应为O(1)
(2)如何用两个栈来实现一个队列
(3)如何用两个队列实现一个栈

    对于队列,我们可以联想一下现实生活中的排队,索性我们就假设排队买火车票的场景,我想这个对于大家应该都不会陌生的。这里我们有一个前提,就是不存在插队的现象。那么,首先能买到票离开队伍的是不是第一个去排队的人呢?是不是先排队的人就先买到票呢?我想答案是显然的。于是乎,队列的“先进先出”特性,我想我们是很容易理解的了。这里,我想提的一点是,实际上,队列的动态性是通过head指针和tail指针的移动来实现的,正如我上面所说的那样。那么如何判断一个循环队列是空的或者是满的呢?其实是这样的,我们先来看一下对于队列的入队出队操作,head、tail指针是如何移动的。首先,初始化队列时,将队列的head指针和tail指针同时指向队列的第一个元素,此时队列为空,head=tail=null。当我们执行入队操作时,tail指针向后移动一个单元,head指针不变,此时,head指针正好指向了刚刚入队的元素,tail指针指向了第二个元素(是一个不存放任何数据的单元);而出队时是head指针向后移动一个单元,tail指针不变,此时排在队列第二前的元素就变成队头元素了。当队列满时,head=tail+1。对于上面描述的,建议大家可以在纸上画一下,那样会比较清晰点。也就是说,判断循环队列为空的条件是:head=tail=null;判断循环队列为满的条件是:head=tail+1(这里的1是指一个存储单元)。

    (对于上面提出的三个问题,在这里给出一些提示信息:(1)用环形数组实现 (2)取两个栈,一个栈专门用来模拟队列的队头,即实现出队,另一个用来模拟队列的队尾,实现入队,每次要入队时,就将考虑模拟队头的栈中是否有元素,如果有,就将里面的元素弹出并压入用来模拟队尾的栈,然后再压入即将要入队的元素;出队时,则将队尾栈中的元素弹出再压入队头栈中,然后再对队头栈弹栈,即实现了出队(3)取两个队列,命名为队列A和队列B,第一次压栈时,将元素放入队列A中,第二次压栈时则将元素放入队列B中,然后再队列A中的元素出队放入队列B中,就这样交互进行着,就实现了将“先进先出”转化为“后进先出”了)
0
0
分享到:
评论

相关推荐

    python用栈实现队列

    python用栈实现队列,简单明了易于进一步思考和总结发散思维。

    数据结构课程设计 四题

    仅仅认识到栈和队列是两种特殊的线性表是远远不够的,本次实习的目的在于使读者深入了解栈和队列的特征,以便在实际问题背景下灵活运用它们;同时还将巩固这两种结构的构造方法,接触较复杂问题的递归算法设计。 ...

    算法与数据结构-停车场问题程序

    数据结构中停车场问题程序,用顺序栈表示停车场,用链队列表示便道,如果正在做这个设计,可以参考。

    数据结构–队列(Java实现)

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

    《二叉树及应用》 数据结构中二叉树使用

    [目的] 通过对二叉树的应用,熟练运用递归,栈和队列。 [实现提示] 二叉树中节点的结构如下: class BNode { char m_value; //二叉树中节点的值 BNode* m_left; //指向左子树指针 BNode* m_right;//指向右子树...

    Excel模板大学实验课程改革与学生创新能力培养学生课程实验.doc

    实验课程的基本内容包括线性表类应用实验、栈和队列类应用实验、树和图类应用实验、查找和排序类应用实验以及自主研究性应用实验等。通过课程实验,学生可以加深对课程内容的理解,培养将原理应用于实际的能力。 ...

    python数据结构—2.线性数据结构(栈)

    栈的python实现思考2.栈的应用总结 前言: 在这个系列的第一篇博客中,我主要强调了编程思维的重要性以及如何高效准确的编写出能解决问题的代码,这一篇博客开始就正式开始python数据结构相关的知识。 有一种数据...

    魔王语言.zip

    应首先实现栈和队列的基本运 算。 [ 选作内容 ] (1).由于问题的特殊性, 可以实现栈和队列的顺序存储空间共享。 (2).在程序开始运行时读入一组第一种形式的规则, 而不是把规则定死在程序 中。 (第二种形式的规则...

    siftjava源码-MaoDataStructures:Arrays(数组)、Stacks(栈)、Queues(队列)、LinkedList

    Arrays(数组)、Stacks(栈)、Queues(队列)、LinkedList(链表)、Recursion(递归思想)、BinarySearchTree(二分搜索树)、Set(集合)、Map(映射)、Heap(堆)、PriorityQueue(优先队列)、SegmentTree(线段树)、Trie(字典树)...

    魔王语言 数据结构c语言版

    用下述两条具体规则和上述规则形式(2)实现。设大写字母表示魔王语言的词汇;小写字 母表示人的语言词汇;希腊字母(a,b1,s,y1等)表示可以用大写或小写字母代换的... 思考如何处理,应首先实现栈和队列的基本运算。

    数据结构实验教程

    本书共分9章,包括线性表、栈与队列、串、数组、树和二叉树、图、查找、排序和文件。  本书是清华大学出版社和北京交通大学出版社出版的《数据结构》教材(张凤琴主编)的配套实验教材,也可作为其他数据结构的实验...

    ACM及NOI及CSP比赛经验分享.docx

    深入了解常见的算法,如贪心、动态规划、图论、搜索等,以及数据结构,如栈、队列、链表、树等。 ### 2. **刷题提高编程技能:** - 大量刷题是提高编程技能的有效途径。通过刷不同难度的题目,积累解题经验,熟悉...

    算法导论中文版

     10.1 栈和队列  10.2 链表  10.3 指针和对象的实现  10.4 有根树的表示  思考题  本章注记 第11章 散列表  11.1 直接寻址表  11.2 散列表  11.3 散列函数  11.3.1 除法散列法  11.3.2 乘法...

    深入理解二叉树、满二叉树及完全二叉树.docx

    二叉树是一种非线性结构,比数组、栈、队列等线性结构相比复杂度更高,想要做到心中有“树”,需要自己动手画图、观察、思考,才能领会其真谛。该文将会结合图形,深入理解二叉树、满二叉树及完全二叉树的概念。 二...

    数据结构课程设计-银行业务模拟

    问题描述:假设某银行有2个窗口对外接待客户,从早晨银行开门起不断有客户进入银行,由于每个窗口在某个时刻只能接待一个客户。...数据结构:用队列实现客户排队。用链表实现客户到来和离开事件表。

    Java数据结构与算法源代码

    a.10 个数据结构:数组,链表,栈,队列,散列表,三叉树,堆,跳表图,Trie 树。 b.10 个算法:递归,排序,二分查找,搜索,哈希算法,贪心算法,分治算法,回溯算法,动态规划,字符串匹配算法。 四。学习技巧 ...

    数据结构实验书

    数据结构实验报告书,第一章 实现抽象数据类型 第一节 知识准备 第二节 类C算法的程序实现 第三节 抽象数据类型三元组的定义、表示和实现 ...第三章 栈和队列的应用 第一节 知识准备 第二节 循环队列的表示和实现

    多任务下的数据结构与算法

    本书和传统同类书籍的区别是除了介绍基本的数据结构容器如栈、队列、链表、树、二叉树、红黑树、AVL树和图之外,引进了多任务;还介绍了将任意数据结构容器变成支持多任务的方法;另外,还增加了复合数据结构和动态...

    20151910042-刘鹏-DSA思考题-06 - list abstraction1

    课本第六章与课本第三章之间的联系。答:根据第三章的知识,设计复杂度较低的结构。解释课本第五章的栈结构、队列结构、双端队列结构与课本第六章的表结构之间的联系。答:

Global site tag (gtag.js) - Google Analytics