当前位置: 首页 > news >正文

基于C#实现双端队列

话说有很多数据结构都在玩组合拳,比如说:块状链表,块状数组,当然还有本篇的双端队列,是的,它就是栈和队列的组合体。

一、概念

我们知道普通队列是限制级的一端进,另一端出的 FIFO 形式,栈是一端进出的 LIFO 形式,而双端队列就没有这样的限制,也就是我们可以在队列两端进行插入或者删除操作。

二、编码

2.1、定义结构体

通常情况下,队列的内部都是采用数组来实现,而且带有两个指针 head 和 tail 来指向数组的区间段,为了充分利用数组空间,我们也会用 % 来实现逻辑上的循环数组,如下图。
image.png

 public class MyQueue{public int head;public int tail;public int maxSize;public int size;public T[] list;public MyQueue(){head = tail = size = 0;maxSize = 3;list = new T[maxSize];}}

这里有一个注意的细节就是“size 字段“,它是为了方便统计队列是否为满或者队列是否为空。

2.2、队尾入队

刚才也说了,双端队列是可以在队列的两端进行插入和删除的,要注意的是我们用 head 和 tail 指针的时候,tail 指针是指向元素的下一个位置,
而 head 指针是指向当前元素,所以我们可以从 tail 端 push 数据的时候只要”顺时针“下移一个位置即可。

 /// <summary>/// 队尾入队/// </summary>/// <param name="t"></param>/// <returns></returns>public bool Push_Tail(T t){//判断队列是否已满if (myQueue.size == myQueue.list.Length)return false;myQueue.list[myQueue.tail] = t;//顺时针旋转myQueue.tail = (myQueue.tail + 1) % myQueue.maxSize;myQueue.size++;return true;}

2.3、队尾出队

和队尾入队一样,我们只要将 tail 指针”逆时针“下移一个位置,当然有一个细节需要注意,就是 tail 指针有存在负值的情况,毕竟我们是做”–操作“的,所以需要 tail+maxSize,即:

myQueue.tail = (--myQueue.tail + myQueue.maxSize) % myQueue.maxSize;
 /// <summary>/// 队尾出队/// </summary>/// <param name="edges"></param>/// <param name="t"></param>public T Pop_Tail(){//判断队列是否已空if (myQueue.size == 0)return default(T);//逆时针旋转(防止负数)myQueue.tail = (--myQueue.tail + myQueue.maxSize) % myQueue.maxSize;var temp = myQueue.list[myQueue.tail];//赋予空值myQueue.list[myQueue.tail] = default(T);myQueue.size--;return temp;}

2.4、队首入队

从 head 端来说,我们 push 数据的时候是 head 指针“逆时针”旋转,要注意的是同样要防止负数的产生,并且 head 指针是指向当前元素。

 /// <summary>/// 队首入队/// </summary>/// <param name="t"></param>/// <returns></returns>public bool Push_Head(T t){//判断队列是否已满if (myQueue.size == myQueue.list.Length)return false;//逆时针旋转(防止负数产生)myQueue.head = (--myQueue.head + myQueue.maxSize) % myQueue.maxSize;//赋予元素myQueue.list[myQueue.head] = t;myQueue.size++;return true;}

2.5、队首出队

说到这个方法,我想大家应该都懂了双端队列的大概流程了,这个方法我也不用赘叙了。

 /// <summary>/// 队首出队/// </summary>/// <param name="edges"></param>/// <param name="t"></param>public T Pop_Head(){//判断队列是否已空if (myQueue.size == 0)return default(T);//获取队首元素var temp = myQueue.list[myQueue.head];//原来单位的值赋默认值myQueue.list[myQueue.head] = default(T);//顺时针旋转myQueue.head = (myQueue.head + 1) % myQueue.maxSize;myQueue.size--;return temp;}

从上面的四个方法可以看出:
当我们只使用 Push_Tail 和 Pop_Tail 的话,那它就是栈。
当我们只使用 Push_Tail 和 Pop_Head 的话,那它就是队列。
最后是全部代码:

 using System.Net;using System;using System.IO;using System.Collections.Generic;using System.Text;using System.Drawing;using System.Drawing.Imaging;class Program{static void Main(string[] args){DoubleQueue<int> queue = new DoubleQueue<int>();queue.Push_Tail(10);queue.Push_Tail(20);queue.Push_Tail(30);queue.Pop_Tail();queue.Pop_Tail();queue.Pop_Tail();queue.Push_Tail(10);queue.Push_Head(20);queue.Push_Head(30);queue.Push_Head(30);queue.Pop_Tail();queue.Pop_Tail();queue.Pop_Head();queue.Push_Head(40);queue.Push_Tail(50);queue.Push_Tail(60);}}/// <summary>/// 双端队列/// </summary>public class DoubleQueue<T>{public class MyQueue{public int head;public int tail;public int maxSize;public int size;public T[] list;public MyQueue(){head = tail = size = 0;maxSize = 3;list = new T[maxSize];}}MyQueue myQueue = new MyQueue();/// <summary>/// 队尾入队/// </summary>/// <param name="t"></param>/// <returns></returns>public bool Push_Tail(T t){//判断队列是否已满if (myQueue.size == myQueue.list.Length)return false;myQueue.list[myQueue.tail] = t;//顺时针旋转myQueue.tail = (myQueue.tail + 1) % myQueue.maxSize;myQueue.size++;return true;}/// <summary>/// 队尾出队/// </summary>/// <param name="edges"></param>/// <param name="t"></param>public T Pop_Tail(){//判断队列是否已空if (myQueue.size == 0)return default(T);//逆时针旋转(防止负数)myQueue.tail = (--myQueue.tail + myQueue.maxSize) % myQueue.maxSize;var temp = myQueue.list[myQueue.tail];//赋予空值myQueue.list[myQueue.tail] = default(T);myQueue.size--;return temp;}/// <summary>/// 队首入队/// </summary>/// <param name="t"></param>/// <returns></returns>public bool Push_Head(T t){//判断队列是否已满if (myQueue.size == myQueue.list.Length)return false;//逆时针旋转(防止负数产生)myQueue.head = (--myQueue.head + myQueue.maxSize) % myQueue.maxSize;//赋予元素myQueue.list[myQueue.head] = t;myQueue.size++;return true;}/// <summary>/// 队首出队/// </summary>/// <param name="edges"></param>/// <param name="t"></param>public T Pop_Head(){//判断队列是否已空if (myQueue.size == 0)return default(T);//获取队首元素var temp = myQueue.list[myQueue.head];//原来单位的值赋默认值myQueue.list[myQueue.head] = default(T);//顺时针旋转myQueue.head = (myQueue.head + 1) % myQueue.maxSize;myQueue.size--;return temp;}}

相关文章:

基于C#实现双端队列

话说有很多数据结构都在玩组合拳&#xff0c;比如说&#xff1a;块状链表&#xff0c;块状数组&#xff0c;当然还有本篇的双端队列&#xff0c;是的&#xff0c;它就是栈和队列的组合体。 一、概念 我们知道普通队列是限制级的一端进&#xff0c;另一端出的 FIFO 形式&#…...

蓝桥杯物联网竞赛_STM32L071_4_按键控制

原理图&#xff1a; 当按键S1按下PC14接GND&#xff0c;为低电平 CubMX配置: Keil配置&#xff1a; main函数&#xff1a; while (1){/* USER CODE END WHILE */OLED_ShowString(24, 0, "<KeyCheck>", 16);if(Function_KEY_S1Check() 1){ OLED_ShowString(…...

【后端卷前端】

为啥现在对后端要求这么高?为啥不要求前端会后端呢? 可能是后端人太多了,要求后端需要会前端的框架(vue react angular ), 这不我为了适应市场的需求来系统的学习vue了: 生成一个基础的vue项目 创建vue项目 vue create projectname 创建vitevue npm init vitelatest p…...

二叉树题目:结点与其祖先之间的最大差值

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;结点与其祖先之间的最大差值 出处&#xff1a;1026. 结点与其祖先之间的最大差值 难度 5 级 题目描述 要求 给…...

平衡树 - splay

相比于之前的普通平衡树进行左旋右旋来比&#xff0c;splay的适用性更高&#xff0c;使用更广泛。 核心函数rotate、splay函数&#xff0c;其它的根据需要进行修改。 int n, m; struct Node {int s[2], p, v, cnt; // 左右儿子、父节点、值、出现数量int size, flag; // 子树大…...

Spring Validation实践及其实现原理

Bean Validation 2.0 注解 校验空值 Null&#xff1a;验证对象是否为 null NotNull&#xff1a;验证对象是否不为 null NotEmpty&#xff1a;验证对象不为 null&#xff0c;且长度&#xff08;数组、集合、字符串等&#xff09;大于 0 NotBlank&#xff1a;验证字符串不为 nul…...

Java核心知识点整理大全18-笔记

Java核心知识点整理大全-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全2-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全3-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全4-笔记-CSDN博客 Java核心知识点整理大全5-笔记-CSDN博客 Java核心知识点整理大全6…...

vue 富文本编辑器多图上传

首先我使用的富文本编辑器是vue-quill-editor 使用npm进行下载 npm install vue-quill-editor --save当然也可以按照官方的方法下载&#xff0c;到官方 因为我是在原有老项目上开发的使用的组件库是ant-design-vue 1x版&#xff0c;当然使用其他组件库也可以 然后还有重要的一…...

简易地铁自动机售票系统实现(C++)

该程序具有以下功能 (1) 一个地铁路线类 Router&#xff0c;包含路线编号&#xff0c;途中的各个站点。可以新增、删除、查询路线&#xff0c;可以根据线路名称&#xff0c;显示线路图片。 (2) 一个地图类 Map&#xff0c;可以显示所有可以乘坐的地铁站名&#xff0c;以及线路…...

【Spark入门】基础入门

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍Spark的定义、发展、扩展阅读&#xff1a;Spark VS Hadoop、四大特点、框架模块、运行模式、架构角色。 后续会继续分享其他重要知识点总结&#xff0c;如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff…...

【自制开源】实时调参,手写字生成神器!大学生福音,告别繁琐的手写报告。

HandwritingGenerator HandwritingGenerator 是一个使用 PyQt6 制作的手写文本图片生成器。 该工具允许用户自定义多种效果&#xff0c;通过在左边配置效果参数&#xff0c;右边实时预览&#xff0c;并在调整好后输出图片。 效果预览 软件界面预览&#xff1a;一封情书&#x…...

Python 进阶(十一):高精度计算(decimal 模块)

《Python入门核心技术》专栏总目录・点这里 文章目录 1. 导入decimal模块2. 设置精度3. 创建Decimal对象4. 基本运算5. 比较运算6. 其他常用函数7. 注意事项8. 总结 大家好&#xff0c;我是水滴~~ 在进行数值计算时&#xff0c;浮点数的精度问题可能会导致结果的不准确性。为了…...

MCU常用文件格式

1. asm文件 asm是汇编语言源程序的扩展名&#xff0c;.asm文件是以asm作为扩展名的文件&#xff0c;是汇编语言的源程序文件。汇编语言(Assembly Language)是面向机器的程序设计语言&#xff0c;是利用计算机所有硬件特性并能直接控制硬件的语言。在汇编语言中&#xff0c;用助…...

【机器学习】On the Identifiability of Nonlinear ICA: Sparsity and Beyond

前言 本文是对On the Identifiability of Nonlinear ICA: Sparsity and Beyond (NIPS 2022)中两个结构稀疏假设的总结。原文链接在Reference中。 什么是ICA(Independent component analysis)&#xff1f; 独立成分分析简单来说&#xff0c;就是给定很多的样本X&#xff0c;通…...

RBAC(Role-Based Access Control,基于角色的访问控制)

1. RBAC核心概念 RBAC&#xff08;Role-Based Access Control&#xff0c;基于角色的访问控制&#xff09;是一种广泛应用于软件和系统中的权限管理模型。它通过将用户与角色关联&#xff0c;再将角色与访问权限关联&#xff0c;来管理用户对系统资源的访问。RBAC模型的主要特…...

C++const指针的两种用法

const int *p &a; 指向const变量的指针 指向const变量的指针const修饰的变量&#xff0c;只能由指向const变量的指针去指向 p &a1;const的位置&#xff0c;必须在*的左边指向const变量的指针&#xff0c;可以被改变&#xff0c;可以指向别的变量可以指向普通变量&am…...

【Proteus仿真】【51单片机】智能垃圾桶设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用报警模块、LCD1602液晶模块、按键模块、人体红外传感器、HCSR04超声波、有害气体传感器、SG90舵机等。 主要功能&#xff1a; 系统运行后&#xf…...

【Windows】执行tasklist/taskkill提示“错误:找不到”或者“ERROR: not found”的解决方案

原因 由于WinMgmt异常导致起不来&#xff0c;而WinMgmt是SVCHOST进程中的WMI服务&#xff0c;解决这个问题需要停止之后再重新启动。 WinMgmt是Windows 2000客户端管理的核心组件&#xff0c;当客户端应用程序连接或当管理程序需要它本身的服务时&#xff0c;这个进程就会初始…...

MS2630——Sub-1 GHz、低噪声放大器芯片

产品简述 MS2630 是一款 Sub-1 GHz 低功耗、低噪声放大器 (LNA) 芯 片。芯片采用先进制造工艺&#xff0c;采用 SOT23-6 的封装形式。 主要特点 ◼ 典型噪声系数&#xff1a; 1.57dB ◼ 典型功率增益&#xff1a; 16.3dB ◼ 典型输出 P1dB &#xff1a; -9.2dBm…...

车载以太网-数据链路层-MAC

文章目录 车载以太网MAC(Media Access Control)车载以太网MAC帧格式以太网MAC帧报文示例车载以太网MAC层测试内容车载以太网MAC(Media Access Control) 车载以太网MAC(Media Access Control)是一种用于车载通信系统的以太网硬件地址,用于在物理层上识别和管理数据包的传…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...