c# stack 和 queue 的区别
发布时间 - 2026-01-13 00:00:00 点击率:次Stack是后进先出(LIFO),Queue是先进先出(FIFO);二者API强制约束访问顺序,不支持随机索引、线程不安全,应优先使用泛型版本并预估容量。
Stack 和 Queue 的核心行为差异
根本区别就一句话:Stack 是后进先出(LIFO),Queue 是先进先出(FIFO)。这不是“风格不同”,而是 API 强制约束——你没法用 Stack.Pop() 拿到最早塞进去的元素,也没法用 Queue.Dequeue() 拿到最新加的那个。
常见错误现象:
- 误把
Queue当作能“取末尾”的容器,结果发现没有Back()或Last()方法 - 在需要按顺序处理任务(如消息消费)时用了
Stack,导致最新消息被优先处理,逻辑错乱 - 调用
Peek()后直接修改对象状态,却忘了它不移除元素——两次Peek()返回的是同一个引用(对引用类型)
常用方法命名和语义对照
别记英文,记动作。C# 的命名非常直白,但容易因惯性写反:
-
Stack.Push(item)→ 往“顶上”堆一个;Stack.Pop()→ 把“顶上”那个拿走并返回 -
Queue.Enqueue(item)→ 从“尾巴”塞进去;Queue.Dequeue()→ 从“脑袋”拿走并返回 -
Peek()两者都有,但含义一致:看一眼最可访问的那个,不挪动、不删除 - 没有
InsertAt(0, x)或RemoveAt(count-1)—— 这些操作在二者中都不存在,强行模拟会破坏性能和语义

泛型版本才是日常主力,别用非泛型
虽然 System.Collections 下还有非泛型的 Stack 和 Queue(返回 object),但它们在现代 C# 项目里基本只出现在遗留代码或教学示例里。实际开发请无条件使用泛型版本:
var stack = new Stack(); var queue = new Queue ();
原因很实在:
- 避免装箱/拆箱开销(尤其对
int、bool等值类型) - 编译期类型检查,
stack.Push(42)在Stack上直接报错,而不是运行时报InvalidCastException - IDE 智能提示完整,
stack.Peek().Length这种链式调用能直接补全
底层实现没你想象的那么“黑盒”
C# 的 Stack 和 Queue 都是基于数组动态扩容实现的(不是链表)。这意味着:
-
Push/Enqueue平均 O(1),但偶尔触发扩容时是 O(n) —— 如果你能预估大小,构造时传入容量更稳:new Stack(1024) -
Pop/Dequeue都是 O(1),但Queue的内部数组有“头指针+尾指针”双偏移,清空后内存不会自动缩容(Clear()后Count为 0,但内部数组长度不变) - 它们都不支持随机索引访问(没有
this[int i]),试图用 LINQ 的ElementAt()会强制遍历 —— 这说明你可能选错了数据结构
真正容易被忽略的一点:二者都**不保证线程安全**。如果多个线程同时读写同一个实例,必须手动加锁,或者改用 ConcurrentStack / ConcurrentQueue —— 它们不是简单包装,而是重新设计的无锁/细粒度锁实现。
# 区别
# c#
# 无锁
# String
# Object
# count
# bool
# int
# 指针
# 数据结构
# 堆
# 值类型
# 引用类型
# Length
# 泛型
# 线程
# 对象
# this
# linq
# 都是
# 链式
# 塞进
# 的是
# 都有
# 都不
# 没法用
# 多个
# 才是
# 出现在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
教你用AI润色文章,让你的文字表达更专业
高防服务器租用如何选择配置与防御等级?
Python函数文档自动校验_规范解析【教程】
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
WordPress 子目录安装中正确处理脚本路径的完整指南
Bootstrap整体框架之CSS12栅格系统
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
Laravel模型事件有哪些_Laravel Model Event生命周期详解
如何确保西部建站助手FTP传输的安全性?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
LinuxShell函数封装方法_脚本复用设计思路【教程】
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
,南京靠谱的征婚网站?
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
零服务器AI建站解决方案:快速部署与云端平台低成本实践
JavaScript如何实现继承_有哪些常用方法
C++时间戳转换成日期时间的步骤和示例代码
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
HTML 中如何正确使用模板变量为元素的 name 属性赋值
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
奇安信“盘古石”团队突破 iOS 26.1 提权
如何用花生壳三步快速搭建专属网站?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
jQuery validate插件功能与用法详解
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
Laravel如何发送系统通知?(Notification渠道示例)
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
Swift开发中switch语句值绑定模式
JavaScript如何实现倒计时_时间函数如何精确控制
Laravel怎么为数据库表字段添加索引以优化查询
在Oracle关闭情况下如何修改spfile的参数
Laravel如何与Pusher实现实时通信?(WebSocket示例)
php打包exe后无法访问网络共享_共享权限设置方法【教程】
Laravel怎么上传文件_Laravel图片上传及存储配置
PHP 500报错的快速解决方法
如何注册花生壳免费域名并搭建个人网站?
如何在IIS中配置站点IP、端口及主机头?
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理

