C#中LinkedList、Queue<T>和Stack<T>的使用

1、LinkedList(链表)

链表中元素存储内存中是不连续分配,每个元素都有记录前后节点,节点值可以重复,不能通过下标访问,泛型的使用保证类型安全,可以避免装箱拆箱,找元素就只能遍历,查找不方便,增删比较快。

例如,

复制代码
Console.WriteLine("***************LinkedList<T>******************");
LinkedList<string> linkedList = new LinkedList<string>();
linkedList.AddFirst("C/C++");
linkedList.AddLast("Java");

bool isContain = linkedList.Contains("Java");
LinkedListNode<string> nodeC = linkedList.Find("C/C++");  // 从头查找
linkedList.AddBefore(nodeC, "C#");
linkedList.AddAfter(nodeC, "Python");
foreach(var item in linkedList)
{
  Console.WriteLine("item = "+item);
}
linkedList.Remove("Java");
linkedList.Remove(nodeC);
linkedList.RemoveFirst();
linkedList.RemoveLast();
linkedList.Clear();

2、Queue<T>(队列)

Queue<T>是链表,先进先出,不能通过下标访问,泛型的使用保证类型安全,可以避免装箱拆箱,找元素就只能遍历,查找不方便,增删比较快。

例如,

复制代码
Console.WriteLine("***************Queue******************");
Queue queue = new Queue();
queue.Enqueue("C/C++");
queue.Enqueue("C#");
queue.Enqueue("Java");
queue.Enqueue("Python");
queue.Enqueue("CJavaPy");
queue.Enqueue("JS");
foreach (string item in queue)
{
    Console.WriteLine(item);
}
Console.WriteLine($"Dequeuing '{queue.Dequeue()}'");
Console.WriteLine($"Peek at next item to dequeue: { queue.Peek()}");
Console.WriteLine($"Dequeuing '{queue.Dequeue()}'");
Queue queueCopy = new Queue(queue.ToArray());
foreach (string item in queueCopy)
{
    Console.WriteLine(item);
}
Console.WriteLine($"queueCopy.Contains(\"c#\") = {queueCopy.Contains("c#")}");
queueCopy.Clear();
Console.WriteLine($"queueCopy.Count = {queueCopy.Count}");

注意ConcurrentQueue 线程安全版本的Queue。

3、Stack<T>(堆栈)

Stack<T>是链表,先进后出,不能通过下标访问,泛型的使用保证类型安全,可以避免装箱拆箱,找元素就只能遍历,查找不方便,增删比较快。

例如,

复制代码
Console.WriteLine("***************Stack******************");
Stack stack = new Stack();
stack.Push("C/C++");
stack.Push("C#");
stack.Push("Java");
stack.Push("Python");
stack.Push("CJavaPy");
stack.Push("JS");
foreach (string item in stack)
{
    Console.WriteLine(item);
}
Console.WriteLine($"Pop '{stack.Pop()}'");//获取并移除
Console.WriteLine($"Peek at next item to dequeue: { stack.Peek()}");//获取不移除
Console.WriteLine($"Pop '{stack.Pop()}'");
Stack stackCopy = new Stack(stack.ToArray());
foreach (string item in stackCopy)
{
    Console.WriteLine(item);
}
Console.WriteLine($"stackCopy.Contains(\"C#\") = {stackCopy.Contains("C#")}");
stackCopy.Clear();
Console.WriteLine($"stackCopy.Count = {stackCopy.Count}");

注意ConcurrentStack线程安全版本的Stack。

相关推荐
Lhan.zzZ34 分钟前
QML 组件库:VS2022 + Qt 静态库方案
开发语言·c++·qt·visual studio
敲代码的嘎仔38 分钟前
28届后端开发-海康威视日常实习一面(已OC)
java·开发语言·后端·面试·海康威视·实习·大厂
sakiko_2 小时前
OC基础语法(与Swift对比)-1
开发语言·ios·objective-c·swift
迷迭香yy2 小时前
基金档案数据工程实战从收入分析到持仓穿透的Python解析 IG50免费开源股票数据API接口
开发语言·python
晊晌_h3 小时前
嵌入式从0到精通——线程
java·开发语言·jvm
一木 之林3 小时前
五、C++ 新特性、关键字与编译原理(进阶)(二)
java·开发语言·c++
OPEN-F3 小时前
C++11/14新特性精讲:移动语义与智能指针实战
开发语言·c++·算法
小灰灰搞电子3 小时前
Rust+Slint 实现动态轮播图源码分享,支持动态删除、添加
开发语言·rust·slint·动态轮播图
前端 贾公子3 小时前
第09章:上下文与记忆 (6)
开发语言·前端·python
sunburn-4 小时前
Java堆(Heap)详解与实战教学
java·开发语言·数据结构·ide·算法