前言
两者抽象数据类型: 网上有,就不想说了。 堆栈:有约束(后入先出)的线性表。 队列:有约束(先入先出)的线性表。
我想说
我的思路来自,因为队列的约束之一是,在线性表中只能在一端或者另一端进行操作。 每一个队列元素我们可以构造一个结构体,这个结构体在线性表的 链式存储实现就可以叫做结点,这句话不是说结构体就是链表中的结点。那么实现队列就很简单了,就是一连串相连的结点。但队列的不同在于其约束,只能在一端(队列头元素)或另一端(队列尾元素)进行操作。如何实现? 在数组中很简单,我们可以令两个坐标front、rear,就可以完成对队列首尾元素的操作。 但链表不行,因为链表的存储位置是不连续的。链表实现相连看起来连续的根本就是指针,并且链表你起初只能得到首结点的信息。但就像你有李华的qq,李华有小明的qq,在你们三个人不是邻居的情况下,只知道你的信息包括qq,如何确定小明的信息,只能通过你找到李华,再找到小明。所以链表不行就在于尾部元素位置不能像数组那样记忆下来。 让我们再回到之前的线性表的链式实现,我们之所以能够控制链表,实质在于我们可以控制链表的头结点,让我们想想,是通过什么?是通过结构体指针。那么不同人对于指针有不同的理解,那我的理解是海贼王的多弗朗明哥的线线果实,一个指针过程是通过找到你的地址,然后找你的信息。忽视这个过程其实指针就可看作明哥的线线果实,如果你被我使用线线果实(指针)所操控,那你就可以被我利用,线性表的链表最初就是因为我们操控了头节点,所以就可以实现后面的增删查。 让我们再回到现在,队列要求我们要能过同时控制两个元素,及两个结点,可是我们只有一个指针,我们只能控制一个,所以队列的链式实现,就是再造一个指针,再用线线果实能力再造一根线。可能不太好理解了,画一个图 就是两个线,方框就是结点,哈哈,可能有些人觉得有些随意了,不严谨,但在我看来,有些时候过分追求严谨反而弄巧成拙,有些道理明明很简单,可是为了表达的严谨,却让大多数人无法从一开始就产生了逃避的理由。在我看来这就是这么一回事,队列要求我们要能同时控制两个元素,我们只有一条线,如果单纯靠一条线,尽管可以实现,但两条线它不香吗? 并且我们知道链表中的结点还有一个“隐形”(不是真隐形,只是没有用,所以相当于隐形)的线,只要我通过我手中的线找到这个结点,我还可以连接我手中的线与你的线就行操作你和其他结点的关系,那个隐形的线就是我们定义结构体变量里面的结构体指针next。
插入操作
完 开个玩笑,应该是这样吧,我们插入一个新的队列元素,建立一个新结点,然后让前一个结点的next(隐形的线)指向新创建的结点。 通过这种线的思想很容易就写出相应代码了吧,我有两根线,现在要求我们控制队列头元素和尾元素进行操作,当然起初,我们假设没有空结点,那么两根线都是控制着一个元素,没有逻辑上的问题。 当然一般来说,一只手只能使用一条线,如果要一只手使用两个线,我们可以通过结构体,一个结构体两个指针,对应一只手两条线。
插入操作很显然通过rear指针(第二条线),我控制这条线找到首结点,然后控制你的第二条线建立你与新结点的联系,对应: Q->rear->next=p(新节点); 但是这样就完了吗?没有,因为要求我们随时都能快速的通过尾指针进行操作,随意我们将第二根线操作新结点,对应 Q->rear=p(新节点); 那么我们还应该思考如果有空结点,插入操作应该注意什么,已经其他操作。 权威结构体创建代码 对于队列,我想的注意点就是这里,那么堆栈就很简单了,只需要控制栈顶,而栈顶就是对应链表的头结点,所以就不用两条线两个指针去控制了。
|