开发手册 欢迎您!
软件开发者资料库

.NET(C#) LinkedList、Queue<T>和Stack<T>的使用

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

1、LinkedList(链表)

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

例如,

Console.WriteLine("***************LinkedList******************");LinkedList linkedList = new LinkedList();linkedList.AddFirst("C/C++");linkedList.AddLast("Java");bool isContain = linkedList.Contains("Java");LinkedListNode 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(队列)

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

例如,

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(堆栈)

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

例如,

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。