上一篇我们通过数组结构实现了栈结构(准确的说是栈的顺序存储结构),现在我们通过链(单链)存储栈,也就是链栈。
通常对于正向单链表来说,是从头节点开始,在链的尾部附加节点,前一个节点的指针指向附加节点;对于实现栈结构来说是在栈顶(链尾部)插入节点,指针指向上一个节点,所以实现栈结构的链可以说是反向单链表。
public class LinkStackNode<T> { /// <summary> /// 数据存储 </summary> public T data { get; set; } 节点指针 public LinkStackNode<T> next { ; } public LinkStackNode(T d) { data = d; } }
<summary> 链栈 </summary> class LinkStack<T> { //对于栈来说,不需要又链的头节点,所以此处我们忽略 栈顶 public LinkStackNode<T> top { 总长度 int count { 入栈 </summary> <param name="data"></param> void push(T data) { LinkStackNode<T> linkedListNode = new LinkStackNode<T>(data); linkedListNode.next = top; top = linkedListNode; count++; } 取栈顶节点,但不删除该节点 <returns></returns> public LinkStackNode<T> Peek() { if(count == 0) throw new InvalidOperationException("空栈"); return top; } 出栈 Pop() { if (count == ); LinkStackNode<T> tp = top.next; count--; tp; } 打印链栈所有元素 showAll() { var node = top; for (int i = 0; i < count; i++) { Console.WriteLine(${i},data:{node.data}); node = node.next; } } }
测试:
LinkStack<string> link = new LinkStack<string>(); link.push(第一); link.push(第二第三); link.showAll(); Console.WriteLine(); Console.WriteLine($Peek:{link.Peek().data}); Console.WriteLine(); link.push(第四第五); Console.WriteLine(); link.showAll(); link.Pop(); Console.WriteLine(); link.showAll();