重生之数据结构与算法----队列&栈
简介
上文说到,数据结构只有两种。其它的数据结构都是它的整花活。
- 栈 
 栈只能在表的一端(称为栈顶)进行插入和删除操作,遵循 “后进先出”(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();
    }
实现比较简单,不再重复,参考普通队列思路即可。链表/环形数组均可实现。
重生之数据结构与算法----队列&栈的更多相关文章
- javascript数据结构与算法---队列
		javascript数据结构与算法---队列 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素 ... 
- JavaScript数据结构与算法-队列练习
		队列的实现 // 队列类 function Deque () { this.dataStore = []; this.enqueueFront = enqueueFront; this.enqueue ... 
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
		本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ... 
- java数据结构与算法之栈(Stack)设计与实现
		本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是一种用于 ... 
- JavaScript数据结构和算法----队列
		前言 队列和栈很像,只是用了不同的原则.队列是遵循先进先出(FIFO)原则的一组有序的的项,队列在尾部添加新元素,从顶部移除元素.最新添加的元素必须必须排队在队列的,末尾.可以想象食堂排队买饭的样子. ... 
- Java数据结构和算法(一)--栈
		栈: 英文名stack,特点是只允许访问最后插入的那个元素,也就是LIFO(后进先出) jdk中的stack源码: public class Stack<E> extends Vector ... 
- Airport Simulation (数据结构与算法 – 队列 / Queue 的应用)
		Airport Simulation 是数据结构与算法教材中用于演示Queue的一个小程序(大多数教师似乎会跳过这个练习).主程序会通过输入总的运行时间.队列里可以等待的最多飞机数量,平均每个时间单元 ... 
- C语言- 基础数据结构和算法 - 09 栈的应用_中缀表达式转后缀表达式20220611
		09 栈的应用_中缀表达式转后缀表达式20220611 听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/ ... 
- C语言- 基础数据结构和算法 - 08 栈的应用_就近匹配20220611
		听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ... 
- C语言- 基础数据结构和算法 - 队列的顺序存储
		听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ... 
随机推荐
- "一基双台三智" 中电金信智慧监督解决方案构筑国央企风控堡垒
			近年来,国务院国资委先后下发<关于进一步排查中央企业融资性贸易业务风险的通知>.<关于规范中央企业贸易管理严禁各类虚假贸易的通知>等各类监管法规,并在2024年初中央企业工作会 ... 
- 中电金信:GienTech动态| 获奖、合作、与伙伴共谋数字化转型…
			  -- -- GienTech动态 -- -- 中电金信携"源启"亮相第十二届中国电子信息博览会  4月11日,为期三天的"第十二届中国电子信息博览会" ... 
- T 语言语法设计方案总结
			早在 2015,我就已经精通了 C++.C#.JS,也用过其它语言,比如 PHP.Python.Java 做过一些项目,就觉得这些语言设计得太过复杂.坑多.麻烦,所以就开始设计一门新语言,暂且叫 T ... 
- 【转载】基于timestamp和nonce的防重放攻击
			https://www.cnblogs.com/mymelody/p/7325325.html 以前总是通过timestamp来防止重放攻击,但是这样并不能保证每次请求都是一次性的.今天看到了一篇 ... 
- Qt编写地图综合应用30-世界地图
			一.前言 世界地图也属于区域地图的一种,最开始做项目的时候只有国内的地图需求,后面有个客户他们的产品是面向国际市场,所以在大屏展示的时候,必须展示一张世界地图,所有箭头动态流向中国,当然这些都要离线使 ... 
- [转]奇异值分解(SVD)方法求解最小二乘问题的原理
			原文链接:奇异值分解(SVD)方法求解最小二乘问题的原理 翻译 搜索 复制 
- Pelco-D控制协议
			1. 通令参数: 标准速率为4800bps,无校验, 8位数据位,1位停止位 2.命令串格式: 一个PTZ控制命令为7字节的十六进制代码,格式如下: Word 1 Word2 Word 3 Wor ... 
- 即时通讯技术文集(第44期):微信、QQ技术精华合集(Part1) [共14篇]
			为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第44 期. [-1-] 微信朋友圈千亿访问量背后的技术挑战和实践总结 [链接] http:/ ... 
- itextpdf 找出PDF中 文字的坐标
			目录 添加引用 添加工具类 调用 找到位置,签名的话见:https://www.cnblogs.com/vipsoft/p/18644127 新项目可以尝试一下 iText 7 , 我这边是老项目所以 ... 
- 【AIGC】Embedding与LLM:token长度限制困局下,长文本LLM应用的暂缓之计
			[详细内容首发于微信公众号(Hobbes View)] 什么是Embedding? Embedding是一种多维向量数组,由一系列数字组成,可以代表任何事物,如文本.音乐.视频等.在这里我们将重点关注 ... 
