第4章 栈、队列、哈希表

序言

堆解决问题?

 

栈解决问题?

 

栈(stack)是一种遵循先入后出逻辑的线性数据结构。

1.基于链表的实现

使用链表实现栈时,我们可以将链表的头节点视为栈顶,尾节点视为栈底。

如图 5-2 所示,对于入栈操作,我们只需将元素插入链表头部,这种节点插入方法被称为“头插法”。而对于出栈操作,只需将头节点从链表中删除即可。

头插法

解释:头插法顾名思义就是在头结点的后面增加结点。

首先创建一个带头结点的空的单链表head

其次按照线性表中元素的逆序依次读入数据元素,如果不是结束标志时,申请结点s,将s结点插入到头结点之后。

 /* 入栈 */
 public void Push(int num)
 {
     //使用链表实现栈时,我们可以将链表的头节点视为栈顶,尾节点视为栈底。
     //对于入栈操作,我们只需将元素插入链表头部,这种节点插入方法被称为“头插法”。而对于出栈操作,只需将头节点从链表中删除即可。
     ListNode addNode = new ListNode(num);
     addNode.next = headNode;
     //每次都把新生成的链表放到头节点的位置
     headNode = addNode;
 }

123按照头插法之后的顺序为321,3占据了头结点的位置。

尾插法

解释:头插法读入的数据元素的顺序与生成的链表中数据元素的顺序是相反的。所以用尾插法就可以很好解决这个问题。

因为每次都必须将新结点插入到链表的尾部,所以需要加入一个尾指针r,用来始终指向链表的尾结点,以便能够将新结点插入到链表的尾部。

2.基于数组的实现

队列

队列(queue)是一种遵循先入先出规则的线性数据结构。

1.基于链表的实现

 我们可以将链表的“头节点”和“尾节点”分别视为“队首”和“队尾”,规定队尾仅可添加节点,队首仅可删除节点。

 

2.基于数组的实现

 

双向队列实现

 

哈希表

https://www.hello-algo.com/chapter_hashing/

 

 

资料

https://www.hello-algo.com/chapter_stack_and_queue/stack/#1

https://www.cnblogs.com/wmyskxz/p/9272295.html

posted @ 2018-04-25 15:08  ~沐风  阅读(187)  评论(0编辑  收藏  举报