1 栈的概念和操作
1.1 栈的基本特征
栈限定只在表尾进行插入和删除的操作,也就是传统意义上的”先进后出“,所以栈也是线性表的一种
1.2 栈的基本操作
- 插入操作 即入栈
- 删除操作 即出栈
2 栈的基本实现
栈属于线性表中的一种,那么就有顺序表和链表两种实现方式,但是不管哪种,都需要下面几个方法
Stack<T>() |
创建一个空的栈 |
void Push(T s) |
往栈中添加一个新的元素 |
T Pop() |
移除并返回最近添加的元素 |
bool IsEmpty() |
栈是否为空 |
int Size() |
栈中元素的个数 |
2.1 栈的顺序存储实现
using System; namespace 数据结构.线性表.栈 { public class StackArr<T> { private T[] Nodes; private int index; /// <summary> /// 初始化栈 /// </summary> /// <param name="length"></param> public StackArr (int length) { Nodes = new T[length]; this.index = 0; } /// <summary> /// 入栈操作 /// </summary> /// <param name="node"></param> public void Push (T node) { if (index == Nodes.Length) { ResizeLength(Nodes.Length * 2); } Nodes[index] = node; index++; Console.WriteLine($"栈的长度是:{Size()},表的长度是{this.Nodes.Length}"); } /// <summary> /// 出栈操作 /// </summary> /// <returns></returns> public T Pop () { if (index == 0) { return default; } T node = Nodes[index - 1]; index--; Nodes[index] = default(T); if (index > 0 && index == Nodes.Length / 4) { ResizeLength(Nodes.Length / 2); } Console.WriteLine($"取出的元素是{node};栈的长度是:{Size()},表的长度是{this.Nodes.Length}"); return node; } /// <summary> // 重构栈 /// </summary> /// <param name="newLength"></param> public void ResizeLength (int newLength) { T[] newNodes = new T[newLength]; if (newLength > Nodes.Length) { for (var i = 0; i < Nodes.Length; i++) { newNodes[i] = Nodes[i]; } } else { for (var i = 0; i < newLength; i++) { newNodes[i] = Nodes[i]; } } Nodes = newNodes; } /// <summary> /// 获取栈的长度 /// </summary> /// <returns></returns> public int Size () { return this.index; } /// <summary> /// 判断 /// </summary> /// <returns></returns> public bool IsEmpty () { return index == 0; } } }
2.2 栈的链式存储实现
using System; using 数据结构.链表; namespace 数据结构.线性表.栈 { public class StackALinkList<T> { int index; /// <summary> /// 头结点 /// </summary> private Node<T> head; /// <summary> /// 初始化栈 /// </summary> public StackALinkList () { head = null; } /// <summary> /// 入栈操作 /// </summary> /// <param name="node"></param> public void Push (T node) { Node<T> newNode = new Node<T>(node); newNode.Next = this.head; this.head = newNode; index++; Console.WriteLine($"入栈的元素是{node};栈的长度是:{Size()}"); } /// <summary> /// 出栈操作 /// </summary> /// <returns></returns> public T Pop () { if (IsEmpty()) return default; var node = head; head = head.Next; index--; Console.WriteLine($"出栈的元素是{node.Item};栈的长度是:{Size()}"); return node.Item; } /// <summary> /// 获取栈的长度 /// </summary> /// <returns></returns> public int Size () { return this.index; } /// <summary> /// 判断 /// </summary> /// <returns></returns> public bool IsEmpty () { return index == 0; } } }
3 C#中栈的实现
c#中也有栈的实现,即 命名空间System.Collections.Generic内的Stack,也提供了Push,Pop方法,同时还提供了Peek方法(获取头部的元素但不删除它),没有反看源码,但是查资料C#内部是用的数组的形式来实现栈的。
以后遍历元素,使用栈貌似会方便快捷很多啊