当前位置: 首页 > 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)是一种用于车载通信系统的以太网硬件地址,用于在物理层上识别和管理数据包的传…...

VMware 虚拟机网络问题排查与解决方案

VMware 虚拟机网络问题排查与解决方案 问题背景 在项目中时&#xff0c;遇到一个看似 "网络不通" 的问题&#xff1a;Windows 宿主机无法 ping 通虚拟机上的 VIP 地址。 症状表现&#xff1a; 虚拟机可以 ping 通 Windows 宿主机Windows 宿主机无法 ping 通虚拟机…...

FastGPT与OneAPI的完美结合:如何高效管理多模型接口

FastGPT与OneAPI的深度整合&#xff1a;构建企业级多模型管理平台 在AI技术快速迭代的今天&#xff0c;企业开发者面临着一个核心挑战&#xff1a;如何高效管理和调用多个大语言模型API。不同厂商的接口规范、计费方式和性能表现各异&#xff0c;这给实际业务集成带来了巨大复杂…...

Qwen2.5-VL-7B-Instruct部署教程:国产化信创环境(昇腾/海光)适配可行性分析

Qwen2.5-VL-7B-Instruct部署教程&#xff1a;国产化信创环境&#xff08;昇腾/海光&#xff09;适配可行性分析 1. 项目背景与意义 Qwen2.5-VL-7B-Instruct作为阿里通义千问推出的多模态大模型&#xff0c;在图文理解和交互方面表现出色。随着国产化信创环境的普及&#xff0…...

开源工具SMUDebugTool完全指南:从故障解决到性能调优

开源工具SMUDebugTool完全指南&#xff1a;从故障解决到性能调优 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://git…...

腾视科技大模型一体机解决方案:低成本私有化落地,重塑行业智能应用新格局

在数字化浪潮席卷各行各业的今天&#xff0c;大模型技术正成为驱动创新的核心引擎。然而&#xff0c;企业在引入大模型时&#xff0c;往往面临数据安全难保障、长期成本高、场景适配性不足等痛点。腾视科技深耕技术研发&#xff0c;推出“大模型一体机低成本私有化落地解决方案…...

QMCDecode:解锁QQ音乐加密格式,让音乐真正属于你

QMCDecode&#xff1a;解锁QQ音乐加密格式&#xff0c;让音乐真正属于你 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&#xff0c…...

通义实验室正式开源 Mobile-Agent v3.5 及新一代多平台 GUI Agent 基座模型 GUI-Owl-1.5

做过自动化的人都知道&#xff0c;最让人抓狂的不是功能实现不了&#xff0c;而是流程跑到一半突然卡住——界面变了、元素找不到、验证码弹出来……GUI Agent 在实验室里跑得再顺&#xff0c;一到真实环境就各种翻车。通义实验室这次发布的 Mobile-Agent v3.5&#xff0c;瞄准…...

OpenClaw对比测试:Qwen3.5-9B与14B版本在自动化任务中的表现

OpenClaw对比测试&#xff1a;Qwen3.5-9B与14B版本在自动化任务中的表现 1. 测试背景与动机 最近在折腾OpenClaw自动化任务时&#xff0c;遇到一个很实际的问题&#xff1a;到底该用Qwen3.5-9B还是14B版本&#xff1f; 这两个版本在官方文档里都标榜"强逻辑推理"和…...

Vivado时序报错排查与跨时钟域处理实战指南

1. Vivado时序报错排查基础 遇到Vivado时序报错时&#xff0c;很多开发者第一反应是直接修改约束文件&#xff0c;这其实是个误区。我建议先从代码层面入手排查&#xff0c;因为大多数时序问题根源都在RTL设计上。打开Vivado的时序报告&#xff0c;你会看到类似"Setup/Hol…...

远程电脑连接tplink路由器中的虚拟专网

文章目录前言一、配置路由器1.配置虚拟专网2.新增地址池3.配置用户二、远程电脑连接1.搜索虚拟专网并打开2.配置连接信息3.问题1-连接不上4.问题2-默认网关“争夺”&#x1f50d; 为什么会这样&#xff1f;—— 默认网关的“争夺”&#x1f6e0;️ 如何改变&#xff1f;—— 启…...