C#数据结构-链栈
2024-09-10 13:19:15
上一篇我们通过数组结构实现了栈结构(准确的说是栈的顺序存储结构),现在我们通过链(单链)存储栈,也就是链栈。
通常对于正向单链表来说,是从头节点开始,在链的尾部附加节点,前一个节点的指针指向附加节点;对于实现栈结构来说是在栈顶(链尾部)插入节点,指针指向上一个节点,所以实现栈结构的链可以说是反向单链表。
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();
最新文章
- jQuery中方法html()与text()的不同
- 嵌入资源的方式让Winform使用系统没有的字体,无需安装字体
- pyhon之对memcached及redis操作
- 《J2EE,J2SE,J2ME》
- INDY idhttp Post用法
- 将Ecshop后台fckeditor升级更改为kindeditor 4.1.10编辑器
- 如何制作网页小动画?——gif or png
- img超出div width时, jQuery动态改变图片显示大小
- jQuery获取JSON格式数据方法
- Servlet 技术全总结 (已完成,不定期增加内容)
- ES6之";let";能替代";var";吗?
- php+xdebug+phpstorm(mac os x+homebrew)
- 关于ASP.NET MVC的js和css资源管理
- 20190404-transition、transform转换、animation、媒体查询
- GMA Round 1 波动函数
- document.getElementsByClassName() 原生方法 通过className 选择DOM节点
- gettimeofday()函数来得到时间
- 新版本的body-parser中间件和morgan中间件引用问题:body-parser deprecated bodyParser和morgan deprecated morgan(options)
- Oracle和MySQL的高可用方案对比【转】
- Feature Tools 简介
热门文章
- vue实现侧边导航栏
- Q200510-01: 求部门工资最高的员工
- 关于取表中id最大值+1的select语句,哪种效率更高?
- 三、spring boot开发web应用-使用传统的JDBC
- 再学ajax--第二天 | 基于php+mysql+ajax的表单注册、登录、注销
- Python+Appium实现APP自动化测试
- 强大的 Node.js Web 框架 - Daze.js
- idea启动springmvc项目时报找不到类
- python条件控制语句要注意什么?本文详解
- NMAP类型题目 (escapeshellarg,escapeshellcmd使用不当)