上一篇我们通过数组结构实现了栈结构(准确的说是栈的顺序存储结构),现在我们通过链(单链)存储栈,也就是链栈。

通常对于正向单链表来说,是从头节点开始,在链的尾部附加节点,前一个节点的指针指向附加节点;对于实现栈结构来说是在栈顶(链尾部)插入节点,指针指向上一个节点,所以实现栈结构的链可以说是反向单链表。

    public class LinkStackNode<T>
{
/// <summary>
/// 数据存储
/// </summary>
public T data { get; set; }
/// <summary>
/// 节点指针
/// </summary>
public LinkStackNode<T> next { get; set; }
public LinkStackNode(T d)
{
data = d;
}
}
    /// <summary>
/// 链栈
/// </summary>
public class LinkStack<T>
{
//对于栈来说,不需要又链的头节点,所以此处我们忽略
/// <summary>
/// 栈顶
/// </summary>
public LinkStackNode<T> top { get; set; }
/// <summary>
/// 总长度
/// </summary>
public int count { get; set; }
/// <summary>
/// 入栈
/// </summary>
/// <param name="data"></param>
public void push(T data)
{
LinkStackNode<T> linkedListNode = new
LinkStackNode<T>(data);
linkedListNode.next = top;
top = linkedListNode;
count++;
}
/// <summary>
/// 取栈顶节点,但不删除该节点
/// </summary>
/// <returns></returns>
public LinkStackNode<T> Peek()
{
if(count == 0)
throw new InvalidOperationException("空栈");
return top;
}
/// <summary>
/// 出栈
/// </summary>
/// <returns></returns>
public LinkStackNode<T> Pop()
{
if (count == 0)
throw new InvalidOperationException("空栈");
LinkStackNode<T> tp = top;
top = top.next;
count--;
return tp;
}
/// <summary>
/// 打印链栈所有元素
/// </summary>
public void 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.push("第三");
link.showAll();
Console.WriteLine();
Console.WriteLine($"Peek:{link.Peek().data}");
Console.WriteLine();
link.push("第四");
link.push("第五");
Console.WriteLine();
link.showAll();
link.Pop();
Console.WriteLine();
link.showAll();


最新文章

  1. jQuery中方法html()与text()的不同
  2. 嵌入资源的方式让Winform使用系统没有的字体,无需安装字体
  3. pyhon之对memcached及redis操作
  4. 《J2EE,J2SE,J2ME》
  5. INDY idhttp Post用法
  6. 将Ecshop后台fckeditor升级更改为kindeditor 4.1.10编辑器
  7. 如何制作网页小动画?——gif or png
  8. img超出div width时, jQuery动态改变图片显示大小
  9. jQuery获取JSON格式数据方法
  10. Servlet 技术全总结 (已完成,不定期增加内容)
  11. ES6之&quot;let&quot;能替代&quot;var&quot;吗?
  12. php+xdebug+phpstorm(mac os x+homebrew)
  13. 关于ASP.NET MVC的js和css资源管理
  14. 20190404-transition、transform转换、animation、媒体查询
  15. GMA Round 1 波动函数
  16. document.getElementsByClassName() 原生方法 通过className 选择DOM节点
  17. gettimeofday()函数来得到时间
  18. 新版本的body-parser中间件和morgan中间件引用问题:body-parser deprecated bodyParser和morgan deprecated morgan(options)
  19. Oracle和MySQL的高可用方案对比【转】
  20. Feature Tools 简介

热门文章

  1. vue实现侧边导航栏
  2. Q200510-01: 求部门工资最高的员工
  3. 关于取表中id最大值+1的select语句,哪种效率更高?
  4. 三、spring boot开发web应用-使用传统的JDBC
  5. 再学ajax--第二天 | 基于php+mysql+ajax的表单注册、登录、注销
  6. Python+Appium实现APP自动化测试
  7. 强大的 Node.js Web 框架 - Daze.js
  8. idea启动springmvc项目时报找不到类
  9. python条件控制语句要注意什么?本文详解
  10. NMAP类型题目 (escapeshellarg,escapeshellcmd使用不当)