登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
每日签到
每天签到奖励2圆-6圆
发帖说明
VIP申请
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
VIP申请
VIP网盘
网盘
联系我们
每日签到
道具
勋章
任务
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
重生之数据结构与算法----队列&栈
重生之数据结构与算法----队列&栈
[ 复制链接 ]
呼延含玉
2025-6-4 22:21:18
简介
上文说到,数据结构只有两种。其它的数据结构都是它的整花活。
栈
栈只能在表的一端(称为栈顶)进行插入和删除操作,遵循 “后进先出”(Last In First Out,LIFO)的原则。就像生活中的一摞盘子,最后放上去的盘子会最先被拿走
队列
它只允许在表的一端进行插入操作(队尾),在另一端进行删除操作(队头),遵循 “先进先出”(First In First Out,FIFO)的原则。类似于生活中排队买票,先排队的人先买到票离开队列。
用链表实现stack
public class MyLinkedStack<T>()
{
public static void Run()
{
var stack = new MyLinkedStack<string>();
stack.Push("aaaa");
stack.Push("bbbb");
stack.Push("cccc");
stack.Push("dddd");
while (stack.Count > 0)
{
Console.WriteLine(stack.Pop());
}
}
private LinkedList<T> _linked = new LinkedList<T>();
/// <summary>
/// 入栈
/// O(1)
/// </summary>
/// <param name="item"></param>
public void Push(T item)
{
_linked.AddFirst(item);
}
/// <summary>
/// 出栈
/// O(1)
/// </summary>
/// <returns></returns>
public T Pop()
{
var first = _linked.First;
_linked.RemoveFirst();
return first.Value;
}
/// <summary>
/// 查看栈顶
/// </summary>
/// O(1)
/// <returns></returns>
public T Peek()
{
return _linked.First.Value;
}
public int Count { get { return _linked.Count; } }
}
复制代码
用链表实现queue
public class MyLinkedQueue<T>
{
public static void Run()
{
var queue = new MyLinkedQueue<string>();
queue.Enqueue("aaa");
queue.Enqueue("bbb");
queue.Enqueue("ccc");
queue.Enqueue("ddd");
while (queue.Count > 0)
{
Console.WriteLine(queue.Dequeue());
}
}
private LinkedList<T> _linked = new LinkedList<T>();
/// <summary>
/// 入列
/// </summary>
/// <param name="item"></param>
public void Enqueue(T item)
{
_linked.AddFirst(item);
}
/// <summary>
/// 出列
/// </summary>
/// <returns></returns>
public T Dequeue()
{
var last= _linked.Last;
_linked.RemoveLast();
return last.Value;
}
/// <summary>
/// 查看队列顶
/// </summary>
/// <returns></returns>
public T Peek()
{
return _linked.First.Value;
}
public int Count { get { return _linked.Count; } }
}
复制代码
用数组实现stack
public class MyArrayStack<T>()
{
public static void Run()
{
var stack = new MyLinkedStack<string>();
stack.Push("aaaa");
stack.Push("bbbb");
stack.Push("cccc");
stack.Push("dddd");
while (stack.Count > 0)
{
Console.WriteLine(stack.Pop());
}
}
private List<T> _list=new List<T>();
/// <summary>
/// 入栈
/// O(1)
/// </summary>
/// <param name="item"></param>
public void Push(T item)
{
_list.Add(item);
}
/// <summary>
/// 出栈
/// O(1)
/// </summary>
/// <returns></returns>
public T Pop()
{
var v = _list[_list.Count - 1];
_list.RemoveAt(_list.Count - 1);
return v;
}
/// <summary>
/// 查看栈顶
/// </summary>
/// O(1)
/// <returns></returns>
public T Peek()
{
return _list[_list.Count - 1];
}
public int Count { get { return _list.Count; } }
}
复制代码
用数组实现queue
由于queue先进先出的特性,list头部增删元素的复杂度是O(N),不符合性能要求,我们可以使用前文介绍的环形数组,来实现list头部增删的O(1)
public class MyArrayQueue<T>
{
public static void Run()
{
var queue = new MyArrayQueue<string>();
queue.Push("aaaa");
queue.Push("bbbb");
queue.Push("cccc");
queue.Push("dddd");
while (queue.Count > 0)
{
Console.WriteLine(queue.Pop());
}
}
private CircularArray<T> _list = new CircularArray<T>();
/// <summary>
/// 入栈
/// O(1)
/// </summary>
/// <param name="item"></param>
public void Push(T item)
{
_list.AddFirst(item);
}
/// <summary>
/// 出栈
/// O(1)
/// </summary>
/// <returns></returns>
public T Pop()
{
var v = _list.GetLast();
_list.RemoveLast();
return v;
}
/// <summary>
/// 查看栈顶
/// </summary>
/// O(1)
/// <returns></returns>
public T Peek()
{
return _list.GetFirst();
}
public int Count { get { return _list.Count; } }
}
复制代码
队列的变种:双端队列
所谓双端队列,主要是比普通队列,多一个出入口,可以从队列的两头进行插入,删除。但也破坏了先进先出的原则。
日常场景使用不多。只有 Python用得多一些,因为Python标准库没有提供内置的栈和队列,一般会用双端队列来模拟标准队列。
public interface IMyQueue<T>
{
/// <summary>
/// 从头入列
/// </summary>
/// <param name="item"></param>
void EnqueueFirst(T item);
/// <summary>
/// 从头出列
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
T DequeueFirst(T item);
/// <summary>
/// 从尾入列
/// </summary>
void EnqueueLast();
/// <summary>
/// 从头出列
/// </summary>
/// <returns></returns>
T DequeueLast();
}
复制代码
实现比较简单,不再重复,参考普通队列思路即可。链表/环形数组均可实现。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
重生
数据结构
算法
队列
amp
相关帖子
手算神经网络BP传播算法
聊聊六种负载均衡算法
【LeetCode 74】算法:搜索二维矩阵
PriorityQueue 数据结构底层原理、源码实现可视化分析及应用实战
炼丹心得&调参技巧
KMP 模式串匹配算法讲解
【LeetCode 33】算法:搜索旋转排序数组
使用Yolo12算法进行区域内实时目标计数
求前缀函数的线性算法(KMP)
TypeScript 队列实战:从零实现简单、循环、双端、优先队列,附完整测试代码
vip免费申请,1年只需15美金$
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
手算神经网络BP传播算法
0
67
笙芝
2025-08-31
业界
聊聊六种负载均衡算法
0
309
茅香馨
2025-09-01
科技
【LeetCode 74】算法:搜索二维矩阵
0
337
蒙飘
2025-09-01
业界
PriorityQueue 数据结构底层原理、源码实现可视化分析及应用实战
0
364
痕伯
2025-09-01
科技
炼丹心得&调参技巧
0
919
章海
2025-09-02
安全
KMP 模式串匹配算法讲解
0
313
赶塑坠
2025-09-02
科技
【LeetCode 33】算法:搜索旋转排序数组
0
924
打阗渖
2025-09-05
业界
使用Yolo12算法进行区域内实时目标计数
0
114
孟清妍
2025-09-05
安全
求前缀函数的线性算法(KMP)
0
525
映各
2025-09-07
业界
TypeScript 队列实战:从零实现简单、循环、双端、优先队列,附完整测试代码
0
252
蓟晓彤
2025-09-09
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
科技
签约作者
程序园优秀签约作者
发帖
呼延含玉
2025-6-4 22:21:18
关注
0
粉丝关注
25
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
敖可
9984
杭环
9988
凶契帽
9988
4
氛疵
9988
5
黎瑞芝
9988
6
猷咎
9986
7
里豳朝
9986
8
肿圬后
9986
9
蝓俟佐
9984
10
虽裘侪
9984
查看更多