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

C#中栈和队列

在C#中,StackQueue是两种不同的集合类型,它们用于实现后进先出(LIFO)和先进先出(FIFO)的数据结构。

Stack(堆栈)

  • Stack是一个后进先出的集合,这意味着最后一个添加到堆栈中的元素将是第一个被移除的元素。

  • Stack类位于System.Collections.Generic命名空间中。

常用方法:
  • Push(T item):将一个元素推入堆栈顶部。

  • Pop():移除堆栈顶部的元素,并返回它。

  • Peek():返回堆栈顶部的元素但不移除它。

  • Clear():移除堆栈中的所有元素。

示例代码:
using System;
using System.Collections.Generic;
​
class Program
{static void Main(){Stack<int> stack = new Stack<int>();stack.Push(1);stack.Push(2);stack.Push(3);
​Console.WriteLine(stack.Pop()); // 输出 3Console.WriteLine(stack.Peek()); // 输出 2}
}

Queue(队列)

  • Queue是一个先进先出的集合,这意味着第一个添加到队列中的元素将是第一个被移除的元素。

  • Queue类也位于System.Collections.Generic命名空间中。

常用方法:
  • Enqueue(T item):将一个元素添加到队列的末尾。

  • Dequeue():移除队列开头的元素,并返回它。

  • Peek():返回队列开头的元素但不移除它。

  • Clear():移除队列中的所有元素。

示例代码:
using System;
using System.Collections.Generic;
​
class Program
{static void Main(){Queue<int> queue = new Queue<int>();queue.Enqueue(1);queue.Enqueue(2);queue.Enqueue(3);
​Console.WriteLine(queue.Dequeue()); // 输出 1Console.WriteLine(queue.Peek());    // 输出 2}
}

性能考虑:

  • StackQueue都提供了高效的元素添加和移除操作。对于StackPushPop操作通常是O(1)的复杂度。对于QueueEnqueueDequeue操作也是O(1)的复杂度。

  • 然而,当队列变得非常大时,Dequeue操作可能会稍微慢一些,因为队列可能需要移动其内部数组中的元素。

使用场景:

  • 使用Stack的场景包括但不限于:表达式求值、语法解析、撤销操作的实现等。

  • 使用Queue的场景包括但不限于:任务调度、广度优先搜索算法、先进先出服务模型等。

选择Stack还是Queue取决于你的具体需求和数据访问模式。

HashSet

HashSet<T> 是 C# 中的一种集合类型,提供了一个不允许重复元素的集合。HashSet<T> 是基于哈希表实现的,这意味着它提供了高效的元素查找、插入和删除操作。

以下是 HashSet<T> 的一些关键特性和操作:

  1. 不允许重复HashSet<T> 保证所有元素都是唯一的,即不会包含重复的元素。

  2. 基于哈希表:内部使用哈希表实现,提供平均常数时间复杂度 O(1) 的添加、删除和查找操作。

  3. 无序集合HashSet<T> 中的元素没有特定的顺序,如果你需要有序的集合,应该使用 SortedSet<T>

  4. 类型安全HashSet<T> 是泛型集合,只能在编译时指定的类型上操作。

常用方法:

  • Add(T item):向集合中添加一个元素。

  • Remove(T item):从集合中移除一个元素。

  • Contains(T item):检查集合是否包含特定的元素。

  • Clear():清空集合中的所有元素。

  • UnionWith(IEnumerable<T> other):将当前集合与另一个集合合并。

  • IntersectWith(IEnumerable<T> other):保留当前集合和另一个集合共有的元素。

  • ExceptWith(IEnumerable<T> other):从当前集合中移除存在于另一个集合中的元素。

  • IsSubsetOf(IEnumerable<T> other):判断当前集合是否是另一个集合的子集。

  • Count:获取集合中元素的数量。

示例代码:

using System;
using System.Collections.Generic;
​
class Program
{static void Main(){HashSet<int> hashSet = new HashSet<int>();
​// 添加元素hashSet.Add(1);hashSet.Add(2);hashSet.Add(3);
​// 尝试添加重复元素,将不会添加hashSet.Add(2);
​// 检查元素是否存在Console.WriteLine(hashSet.Contains(2)); // 输出 True
​// 移除元素hashSet.Remove(2);Console.WriteLine(hashSet.Contains(2)); // 输出 False
​// 获取集合中的元素数量Console.WriteLine(hashSet.Count); // 输出 2
​// 清空集合hashSet.Clear();Console.WriteLine(hashSet.Count); // 输出 0}
}

性能考虑:

  • HashSet<T> 的性能通常非常高效,特别是当元素的哈希函数分布均匀时。

  • 性能可能受到哈希冲突的影响,但 HashSet<T> 通过使用链表或哈希表的动态调整来减少冲突的影响。

使用场景:

  • 当你需要存储一组不重复的元素,并且需要快速查找、添加和删除元素时,HashSet<T> 是一个很好的选择。

  • 它适用于需要快速检查成员资格、执行集合操作(如并集、交集、差集)的场景。

HashSet<T> 是一种非常有用的集合类型,特别是在处理需要快速查找和元素唯一性的场景中。

哈希表

哈希表(Hash Table),也称为散列表,是一种通过哈希函数将键(Key)映射到表中一个位置来访问数据的数据结构。这种数据结构可以快速地插入和查找数据,通常用于实现集合、字典和其他需要快速查找功能的类。

哈希表的基本原理:

  1. 哈希函数:哈希表使用一个哈希函数将键映射到一个整数索引上。理想情况下,这个哈希函数能够将键均匀地分布在整个表中,减少冲突。

  2. 冲突解决:由于哈希函数的输出范围有限,不同的键可能会映射到同一个索引上,这种现象称为冲突。哈希表需要一种机制来解决冲突,常见的方法包括链地址法、开放地址法和再哈希法。

  3. 动态调整:随着元素的不断添加,哈希表可能会变得过于拥挤,这会降低查找效率。因此,哈希表通常会在达到一定负载因子时进行扩容,重新分配所有元素。

哈希表的实现:

  1. 链地址法:每个哈希表的槽位(bucket)都包含一个链表,所有映射到该槽位的元素都存储在这个链表中。这种方法简单且易于实现,但可能会导致链表过长,影响性能。

  2. 开放地址法:当发生冲突时,哈希表会在表中寻找下一个空闲的槽位来存储元素。常见的开放地址法包括线性探测、二次探测和双重哈希。

  3. 再哈希法:使用多个哈希函数,当第一个哈希函数发生冲突时,使用第二个哈希函数计算新的位置,依此类推。

哈希表的性能:

  • 时间复杂度:理想情况下,哈希表的查找、插入和删除操作的时间复杂度为 O(1)。然而,当发生冲突且没有得到妥善处理时,性能可能会下降。

  • 空间复杂度:哈希表需要额外的空间来存储槽位和解决冲突的机制,这可能会增加空间开销。

C#中的哈希表实现:

在C#中,哈希表的概念被广泛应用在多种集合类型中,例如:

  • Dictionary<TKey, TValue>:键值对集合,使用哈希表实现,允许快速查找、插入和删除键值对。

  • HashSet<T>:不允许重复元素的集合,使用哈希表实现,确保所有元素唯一。

  • SortedDictionary<TKey, TValue>:有序键值对集合,使用红黑树和哈希表的组合实现,保持元素有序。

示例代码:

以下是使用 Dictionary<TKey, TValue> 的示例代码:

using System;
using System.Collections.Generic;
​
class Program
{static void Main(){Dictionary<string, int> dictionary = new Dictionary<string, int>();
​// 添加元素dictionary.Add("apple", 1);dictionary.Add("banana", 2);dictionary.Add("orange", 3);
​// 查找元素if (dictionary.TryGetValue("banana", out int value)){Console.WriteLine("Banana count: " + value);}
​// 更新元素dictionary["apple"] = 5;
​// 移除元素dictionary.Remove("orange");
​// 遍历字典foreach (var item in dictionary){Console.WriteLine(item.Key + ": " + item.Value);}}
}

在这个示例中,Dictionary<TKey, TValue> 使用哈希表来存储键值对,提供高效的查找、插入和删除操作。

相关文章:

C#中栈和队列

在C#中&#xff0c;Stack和Queue是两种不同的集合类型&#xff0c;它们用于实现后进先出&#xff08;LIFO&#xff09;和先进先出&#xff08;FIFO&#xff09;的数据结构。 Stack&#xff08;堆栈&#xff09; Stack是一个后进先出的集合&#xff0c;这意味着最后一个添加到堆…...

技战法丨攻防演练防御——纵深、联动、诱捕(可搬运、可cv)

演习活动经过近几年的发展&#xff0c;攻击方的专业水平已大幅提高&#xff0c;逐渐呈现出隐秘化、APT化的趋势。其利用渗透技术对目标系统做深入探测&#xff0c;不断挖掘防守方网络系统的薄弱环节&#xff0c;这就要求防守方构建立体式纵深防护体系来抵御入侵。同时&#xff…...

1、 window平台opencv下载编译, 基于cmake和QT工具链

1. 环境准备&#xff0c;源码下载 1.1 前置环境 qt 下载安装cmake 安装&#xff0c;可参考&#xff1a; https://blog.csdn.net/qq_51355375/article/details/139186681 1.2 opencv 源码下载 官网地址&#xff1a; https://opencv.org/releases/ 下载源码&#xff1a; 2 …...

C++20三向比较运算符详解

三向比较运算符可以用于确定两个值的大小顺序&#xff0c;也被称为太空飞船操作符。使用单个表达式&#xff0c;它可以告诉一个值是否等于&#xff0c;小于或大于另一个值。 它返回的是类枚举&#xff08;enumeration-like&#xff09;类型&#xff0c;定义在 <compare> …...

监听机制与耗电量

一、监听机制与耗电量的关系 监听机制通常涉及对特定事件、状态或数据的持续监测。在移动设备和嵌入式系统中&#xff0c;这种监听可能由多种组件和传感器实现&#xff0c;如GPS、传感器&#xff08;如加速度计、陀螺仪&#xff09;、网络连接等。监听的频率越高&#xff0c;意…...

C++ //练习 16.29 修改你的Blob类,用你自己的shared_ptr代替标准库中的版本。

C Primer&#xff08;第5版&#xff09; 练习 16.29 练习 16.29 修改你的Blob类&#xff0c;用你自己的shared_ptr代替标准库中的版本。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 template <typename> class BlobP…...

【Mode Management】CanNm处于PBS状态下接收到一帧诊断报文DCM会响应吗

目录 前言 正文 1.CanNm从RSS状态切换到PBS状态行为分析 1.1.CanNm动作 1.2.ComM动作 1.3.DCM动作 1.4 小结 2.CanNM在PBS状态下收到一帧诊断报文行为分析 2.1.DCM动作1 2.2. ComM动作 2.3. DCM动作2 2.3. CanNm动作 2.4 问题 2.5 分析 3.总结 前言 我们知道EC…...

【C++】模版:范式编程、函数模板、类模板

目录 一.范式编程 二.函数模板 1.概念与格式 2.原理 3.实例化 4.匹配规则 三.类模板 一.范式编程 在写C函数重载的时候&#xff0c;可能会写很多同一类的函数&#xff0c;例如交换函数&#xff1a; void Swap(int& left, int& right) {int temp left;left r…...

验证图片旋转

最近在使用百度图片翻译时遇到一个问题&#xff0c;就是图片会翻转90&#xff0c;经与百度沟通&#xff0c;发现是原始图片中有个旋转参数引起的。 于是写个demo验证一下。 // 获取元数据中的旋转方向 func getOrientation() int {//打开图像文件f, err : os.Open("image…...

宏景eHR /ajax/ajaxService SQL注入漏洞复现

0x01 产品简介 宏景eHR人力资源管理软件是一款人力资源管理与数字化应用相融合,满足动态化、协同化、流程化、战略化需求的软件。 0x02 漏洞概述 宏景eHR /ajax/ajaxService 接口处存在SQL注入漏洞,,未经身份验证的远程攻击者通过利用SQL注入漏洞配合数据库xp_cmdshell可…...

从源码看 Redis:深入理解 redisDb 和 redisObject

Redis 是一个广泛使用的内存数据库&#xff0c;以其高性能和丰富的数据结构而闻名。不同于磁盘数据库&#xff0c;磁盘数据库将数据读取到文件中维护&#xff0c;而内存数据库将数据存储在内存中&#xff0c;意味着其想要维护数据&#xff0c;必须在代码中维护一个保存数据的结…...

unity中实现流光效果——世界空间下

Properties{_MainTex ("Texture", 2D) "white" {}_FlowColor ("Flow Color", Color) (1, 1, 1, 1) // 流光颜色_FlowFrequency ("Flow Frequency", Float) 1.0 // 流光频率_FlowSpeed ("Flow Speed", Float) 1.0 // 流光…...

项目经验分享:用4G路由器CPE接海康NVR采用国标GB28181协议TCP被动取流一段时间后设备就掉线了

最近我们在做一个生态化养殖的项目时&#xff0c;发现一个奇怪的现象&#xff1a; 项目现场由于没有有线网络&#xff0c;所以&#xff0c;我们在现场IPC接入到海康NVR之后&#xff0c;再通过一款4G的CPE接入到天翼云的国标GB28181视频平台&#xff1b;我们采用UDP协议播放NVR…...

【RabbitMQ】RabbitMQ不公平分发_预取值

一、不公平分发 1、简介 RabbitMQ中的不公平分发&#xff08;Unfair Dispatch&#xff09;是指当多个消费者&#xff08;Consumers&#xff09;同时订阅同一个队列&#xff08;Queue&#xff09;时&#xff0c;消息的分发机制并非严格平均或公平&#xff0c;而是基于某些条件…...

最新AI模型使用指南和模型

市面上最好的AI大模型 OpenAI GPT-4&#xff1a; 概述&#xff1a;GPT-4 是 OpenAI 发布的最新一代大型语言模型&#xff0c;具备更强的理解和生成自然语言的能力。特点&#xff1a; 强大的文本生成和理解能力。支持多语言处理。可用于各种应用场景&#xff0c;如对话生成、内容…...

数据结构之八大基本排序方法

在数据结构中&#xff0c;排序是一个重要的操作&#xff0c;它有助于提高数据的可读性和可操作性。排序算法有多种&#xff0c;各有优缺点&#xff0c;适用于不同的场景。以下是八大经典排序算法的介绍&#xff1a; 1. 冒泡排序&#xff08;Bubble Sort&#xff09; 原理&…...

《Milvus Cloud向量数据库指南》——什么是高可用:深入理解数据库系统中的高可用性架构

什么是高可用:深入理解数据库系统中的高可用性架构 在信息技术日新月异的今天,高可用性(High Availability,简称HA)已成为衡量一个系统,尤其是数据库系统稳定性和可靠性的重要标准。高可用性的核心目标在于确保系统能够持续不断地提供服务,最大限度地减少因维护活动、硬…...

C++ | Leetcode C++题解之第319题灯泡开关

题目&#xff1a; 题解&#xff1a; class Solution { public:int bulbSwitch(int n) {return sqrt(n 0.5);} };...

C# 使用 NLog 输出日志到文件夹

在项目中使用 NuGet 安装 NLog 包以及 NLog.Config 包 配置 nlog.config 在项目的根目录下创建一个 Nlog.config 文件&#xff08;如果还没有&#xff09;&#xff0c;然后添加如下配置&#xff1a; <?xml version"1.0" encoding"utf-8" ?> <…...

node.js使用NodeMachineID 生成唯一UUID和注意事项

node-machine-id用于获取或生成唯一的机器ID 如何使用 const { machineId, machineIdSync } require(node-machine-id) JSON.stringify(machineIdSync({original: true})) ;方法&#xff1a; machineIdSync 此函数同步获取操作系统本机UUID/GUID&#xff0c;默认情况下进行哈…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...