==> 学习汇总(持续更新)
==> 从零搭建后端基础设施系列(一)-- 背景介绍
**基本思想:**在单链表的基础上,限制某些操作,使之成为一种新的数据结构。只准在栈顶(单链表的第一个元素)进行操作。
**优点:**内存是动态分配的。
**缺点:**也是代码相对来说较为复杂。(比单链表简单很多)
C代码实现下载
C++代码实现下载
java代码实现下载
(备用下载地址)
我看有些书,都是定义两个结构体,我觉得这样反而让人头晕,转不过来,本来栈结构和队列结构就是数据结构中最简单的,没必要搞那么复杂。所以,我在单链表的基础上,只实现了入栈(相当于头添加),出栈(相当于删除节点),获取栈顶元素(相当于获取第一个节点,head->next)等功能。现在问题来了,用什么当作栈顶指针?当然是头节点了,这个就是现成的一直指向栈顶(第一个节点)的指针了。然后还有一个问题,用什么记录栈的大小呢?还记得head的数据域data是没有用到的吗?所以现在就是物尽其用的时候,直接利用head->data来记录栈的大小。如果是C++或者JAVA的话,记录栈大小就直接用一个成员变量就好。
实现的功能:
1.void InitStack(); 初始化栈
2.bool IsEmpty(); 栈是否为空
根据top->data的值来判断
3.int GetSize(); 获取当前栈的长度
直接返回top->data
4.void Push(T e); 入栈
就是头添加
示例代码:
Node<T>* node = new Node<T>(m_initValue); //创建一个新的节点
node->data = e;
node->next = m_top->next;
m_top->next = node; //让栈顶指针指向新的栈顶节点
++m_count;
5.void Pop(); 出栈(不返回栈顶元素)
就是删除第一个节点
6.T PopE(); 出栈(返回栈顶元素)
7.T GetTop(); 获取栈顶元素
直接返回top->next->data
8.void Print(); 遍历栈
和单链表一样
9.void ClearStack(); 清空栈
挨个出栈就清空完了