C#中栈和队列
在C#中,Stack
和Queue
是两种不同的集合类型,它们用于实现后进先出(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}
}
性能考虑:
-
Stack
和Queue
都提供了高效的元素添加和移除操作。对于Stack
,Push
和Pop
操作通常是O(1)的复杂度。对于Queue
,Enqueue
和Dequeue
操作也是O(1)的复杂度。 -
然而,当队列变得非常大时,
Dequeue
操作可能会稍微慢一些,因为队列可能需要移动其内部数组中的元素。
使用场景:
-
使用
Stack
的场景包括但不限于:表达式求值、语法解析、撤销操作的实现等。 -
使用
Queue
的场景包括但不限于:任务调度、广度优先搜索算法、先进先出服务模型等。
选择Stack
还是Queue
取决于你的具体需求和数据访问模式。
HashSet
HashSet<T>
是 C# 中的一种集合类型,提供了一个不允许重复元素的集合。HashSet<T>
是基于哈希表实现的,这意味着它提供了高效的元素查找、插入和删除操作。
以下是 HashSet<T>
的一些关键特性和操作:
-
不允许重复:
HashSet<T>
保证所有元素都是唯一的,即不会包含重复的元素。 -
基于哈希表:内部使用哈希表实现,提供平均常数时间复杂度 O(1) 的添加、删除和查找操作。
-
无序集合:
HashSet<T>
中的元素没有特定的顺序,如果你需要有序的集合,应该使用SortedSet<T>
。 -
类型安全:
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)映射到表中一个位置来访问数据的数据结构。这种数据结构可以快速地插入和查找数据,通常用于实现集合、字典和其他需要快速查找功能的类。
哈希表的基本原理:
-
哈希函数:哈希表使用一个哈希函数将键映射到一个整数索引上。理想情况下,这个哈希函数能够将键均匀地分布在整个表中,减少冲突。
-
冲突解决:由于哈希函数的输出范围有限,不同的键可能会映射到同一个索引上,这种现象称为冲突。哈希表需要一种机制来解决冲突,常见的方法包括链地址法、开放地址法和再哈希法。
-
动态调整:随着元素的不断添加,哈希表可能会变得过于拥挤,这会降低查找效率。因此,哈希表通常会在达到一定负载因子时进行扩容,重新分配所有元素。
哈希表的实现:
-
链地址法:每个哈希表的槽位(bucket)都包含一个链表,所有映射到该槽位的元素都存储在这个链表中。这种方法简单且易于实现,但可能会导致链表过长,影响性能。
-
开放地址法:当发生冲突时,哈希表会在表中寻找下一个空闲的槽位来存储元素。常见的开放地址法包括线性探测、二次探测和双重哈希。
-
再哈希法:使用多个哈希函数,当第一个哈希函数发生冲突时,使用第二个哈希函数计算新的位置,依此类推。
哈希表的性能:
-
时间复杂度:理想情况下,哈希表的查找、插入和删除操作的时间复杂度为 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#中,Stack和Queue是两种不同的集合类型,它们用于实现后进先出(LIFO)和先进先出(FIFO)的数据结构。 Stack(堆栈) Stack是一个后进先出的集合,这意味着最后一个添加到堆…...
技战法丨攻防演练防御——纵深、联动、诱捕(可搬运、可cv)
演习活动经过近几年的发展,攻击方的专业水平已大幅提高,逐渐呈现出隐秘化、APT化的趋势。其利用渗透技术对目标系统做深入探测,不断挖掘防守方网络系统的薄弱环节,这就要求防守方构建立体式纵深防护体系来抵御入侵。同时ÿ…...
1、 window平台opencv下载编译, 基于cmake和QT工具链
1. 环境准备,源码下载 1.1 前置环境 qt 下载安装cmake 安装,可参考: https://blog.csdn.net/qq_51355375/article/details/139186681 1.2 opencv 源码下载 官网地址: https://opencv.org/releases/ 下载源码: 2 …...
C++20三向比较运算符详解
三向比较运算符可以用于确定两个值的大小顺序,也被称为太空飞船操作符。使用单个表达式,它可以告诉一个值是否等于,小于或大于另一个值。 它返回的是类枚举(enumeration-like)类型,定义在 <compare> …...
监听机制与耗电量
一、监听机制与耗电量的关系 监听机制通常涉及对特定事件、状态或数据的持续监测。在移动设备和嵌入式系统中,这种监听可能由多种组件和传感器实现,如GPS、传感器(如加速度计、陀螺仪)、网络连接等。监听的频率越高,意…...
C++ //练习 16.29 修改你的Blob类,用你自己的shared_ptr代替标准库中的版本。
C Primer(第5版) 练习 16.29 练习 16.29 修改你的Blob类,用你自己的shared_ptr代替标准库中的版本。 环境:Linux Ubuntu(云服务器) 工具: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函数重载的时候,可能会写很多同一类的函数,例如交换函数: void Swap(int& left, int& right) {int temp left;left r…...
验证图片旋转
最近在使用百度图片翻译时遇到一个问题,就是图片会翻转90,经与百度沟通,发现是原始图片中有个旋转参数引起的。 于是写个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 是一个广泛使用的内存数据库,以其高性能和丰富的数据结构而闻名。不同于磁盘数据库,磁盘数据库将数据读取到文件中维护,而内存数据库将数据存储在内存中,意味着其想要维护数据,必须在代码中维护一个保存数据的结…...
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被动取流一段时间后设备就掉线了
最近我们在做一个生态化养殖的项目时,发现一个奇怪的现象: 项目现场由于没有有线网络,所以,我们在现场IPC接入到海康NVR之后,再通过一款4G的CPE接入到天翼云的国标GB28181视频平台;我们采用UDP协议播放NVR…...
【RabbitMQ】RabbitMQ不公平分发_预取值
一、不公平分发 1、简介 RabbitMQ中的不公平分发(Unfair Dispatch)是指当多个消费者(Consumers)同时订阅同一个队列(Queue)时,消息的分发机制并非严格平均或公平,而是基于某些条件…...
最新AI模型使用指南和模型
市面上最好的AI大模型 OpenAI GPT-4: 概述:GPT-4 是 OpenAI 发布的最新一代大型语言模型,具备更强的理解和生成自然语言的能力。特点: 强大的文本生成和理解能力。支持多语言处理。可用于各种应用场景,如对话生成、内容…...
数据结构之八大基本排序方法
在数据结构中,排序是一个重要的操作,它有助于提高数据的可读性和可操作性。排序算法有多种,各有优缺点,适用于不同的场景。以下是八大经典排序算法的介绍: 1. 冒泡排序(Bubble Sort) 原理&…...
《Milvus Cloud向量数据库指南》——什么是高可用:深入理解数据库系统中的高可用性架构
什么是高可用:深入理解数据库系统中的高可用性架构 在信息技术日新月异的今天,高可用性(High Availability,简称HA)已成为衡量一个系统,尤其是数据库系统稳定性和可靠性的重要标准。高可用性的核心目标在于确保系统能够持续不断地提供服务,最大限度地减少因维护活动、硬…...
C++ | Leetcode C++题解之第319题灯泡开关
题目: 题解: class Solution { public:int bulbSwitch(int n) {return sqrt(n 0.5);} };...
C# 使用 NLog 输出日志到文件夹
在项目中使用 NuGet 安装 NLog 包以及 NLog.Config 包 配置 nlog.config 在项目的根目录下创建一个 Nlog.config 文件(如果还没有),然后添加如下配置: <?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})) ;方法: machineIdSync 此函数同步获取操作系统本机UUID/GUID,默认情况下进行哈…...
AI大模型在数据治理中的应用
目前,企业的数据治理工作以人工实施为主,其中一些重复性较强的工作,如:数据标准制定和映射、元数据信息完善、数据目录挂载等,需要消耗大量的人力和时间成本,这给本来就难以量化业务价值的治理工作的顺利推…...
【初学人工智能原理】【12】循环:序列依赖问题
前言 本文教程均来自b站【小白也能听懂的人工智能原理】,感兴趣的可自行到b站观看。 代码及工具箱 本专栏的代码和工具函数已经上传到GitHub:1571859588/xiaobai_AI: 零基础入门人工智能 (github.com),可以找到对应课程的代码 正文 对于…...
【QT】无法打开QT的ui文件,出现闪退情况
打开qt的ui文件出现闪退的情况: 解决办法:点击扩展-Qt VS Tools-Options 找到Qt General中的Qt Designer 的Run in detached window改为True。...
三、Spring-WebFlux实战案例-流式
目录 一、springboot之间通讯方式 1. 服务端 (Spring Boot) 1.1 添加依赖 1.2 控制器 2. 客户端 (WebClient) 2.1 添加依赖 2.2 客户端代码 3. 运行 二、web与服务之间通讯方式 1、服务端代码 2、客户端代码 3、注意事项 三、移动端与服务端之间通讯方式…...
html+css 实现hover双层按钮
前言:哈喽,大家好,今天给大家分享htmlcss 绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 文…...
SPIFFS与LittleFS的对gz文件格式的区别
SPIFFS 只能安装在Arduino上。LittleFS支持Arduino IDE和VScode的 PlatformIO。 SPIFFS serveStatic: server.serveStatic("/", SPIFFS, "/") 负责提供 SPIFFS 文件系统中的文件。您可以在 SPIFFS 上放置 .gz 文件,并该方法将自动处理它们。 …...
STM32L051K8U6-开发资料
STM32L051测试 (四、Flash和EEPROM的读写)-云社区-华为云 (huaweicloud.com) STM32L051测试 (四、Flash和EEPROM的读写) - 掘金 (juejin.cn) STM32L0 系列 EEPROM 读写,程序卡死?_stm32l0片内eeprom_stm3…...
Markdown语法学习
Markdown学习 一、基础语法讲解 1. 换行 本行末尾双空格然后回车(在Typora的中直接回车也可以) 2. 换段 本段末尾两次回车 3. 加粗 **加粗** __加粗__效果:加粗 4. 斜体 *加粗* _加粗_效果:斜体 5. 斜体加粗 ***加粗**…...
[最短路Floyd],启动!!!
B3647 【模板】Floyd #include<bits/stdc.h> #define ll long long #define fi first #define se second #define pb push_back #define PII pair<int,int > #define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) using namespace std; const int N …...
7月29(信息差)
🌍最强模型 Llama 3.1 如期而至!扎克伯格最新访谈:Llama 会成为 AI 界的 Linux 🎄谷歌AlphaProof攻克国际奥赛数学题 https://www.51cto.com/article/793632.html ✨SearchGPT第一波评测来了!响应速度超快还没广告&…...
建设国外网站/海洋seo
ListView实现自动滚动 由于这两天在做listView的东西,所以整理出来一些我个人认为比较特别的属性,通过设置这样的属性可以做出更加美观的列表 首先是stackFromBottom属性,这只该属性之后你做好的列表就会显示你列表的最下面,值为…...
帝国网站建设/google官网注册
一些"蹊跷"的对象 不知道大家有没有想过为什么有的对象可以使用for循环进行迭代,可以使用in判断它是否包含某个元素,可是使用索引进行取值..... 没错,答案就是这些对象实现了支持这些操作的特殊方法! 比如,…...
大棚网站建设/百度搜索引擎推广怎么弄
package com.what21.base09;/*** 继承*/public class ExtendsTest {public static void main(String[] args) {// 参数为空的构造方法,如果没有其他构造方法,系统自动提供该构造方法。// 如果有其他构造方法,系统不会自动提供,需要…...
广州网站建设流程/谷歌搜索引擎免费入口2022
mysql默认varchar类型是对大小写不敏感(不区分),如果想要mysql区分大小写需要设置排序规则:utf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写。utf8_genera_ci不区分大小写,ci为case insensitive的缩写,即大…...
wordpress语言切换网站/企业网站seo平台
复习题 1.(a)指出对象和类的区别? 类是描述数据封装和数据操作的模板,而对象是类的特殊实例 5.当不能修改对象时,为什么要通过常量引用传递程序员自定义的对象? 使用常量引用传递,可以避免按值传…...
wordpress高级企业自适应主题/搜索关键词的方法
如果按照一个属性分组,请参照下面的文章:http://blog.csdn.net/liuxiao723846/article/details/46518553如果按照多个属性对集合中的数据进行分组,需要把分组字段拼接起来联合比较,代码如下:import java.util.ArrayLis…...