C#学习日记 队列 栈

来源:互联网 发布:淘宝怎么看访客来源 编辑:程序博客网 时间:2024/06/05 10:28

队列,元素是FIFO的方式来处理集合的。队列和集合、StringBuilder这些容量都一样的规则,没有定义容量的时候,添加元素都是容量递增的,成倍增加。其他也没什么特别的了。进队列是Equeue(),出队列是Dequeue()这个例子里关于多线程安全问题我都是是跳过,没研究的,等学到多线程的时候再了解。

using System;using System.Collections.Generic;using System.Threading;using System.Threading.Tasks;namespace Sample{public class MainEntryPoint{static int Main(string[] args){var dm =new DocumentManager();ProcessDocuments.Start(dm);for(int i = 0; i < 1000 ; i++){Document doc = new Document("Doc "+i.ToString(),"content");dm.AddDocument(doc);Console.WriteLine("Added document {0}", doc.Title);Thread.Sleep(new Random().Next(20));}return 0;}}public class Document{public string Title{ get; private set;}public string Content{ get; private set;}public Document(string title, string content){this.Title = title;this.Content = content;}}public class DocumentManager{private readonly Queue<Document> documentQueue = new Queue<Document>();//在队列的队尾添加一个documentpublic void AddDocument(Document doc){lock(this){documentQueue.Enqueue(doc);}}//在队列的头部取出documentpublic Document GetDocument(){Document doc = null;lock(this){doc = documentQueue.Dequeue();}return doc;}//一个标记队列中是否还有document的属性public bool IsDocumentAvailable{get{return documentQueue.Count > 0;}}}public class ProcessDocuments{public static void Start(DocumentManager dm){Task.Factory.StartNew(new ProcessDocuments(dm).Run);}protected ProcessDocuments(DocumentManager dm){if(dm == null)throw new ArgumentNullException("dm");documentManager = dm;}private DocumentManager documentManager;protected void Run(){while(true){if(documentManager.IsDocumentAvailable){Document doc = documentManager.GetDocument();Console.WriteLine("Processing document {0}",doc.Title);}Thread.Sleep(new Random().Next(20));}}}}

栈也是很简单的,LIFO,进栈Push(),出栈Pop()。都和C++里差不多。

using System;using System.Collections.Generic;namespace Sample{public class MainEntryPoint{static int Main(string[] args){Stack<char> alphabet = new Stack<char>();alphabet.Push('A');alphabet.Push('B');alphabet.Push('C');//第一次只是查看了栈内的全部元素 对栈没有任何的改变Console.WriteLine("First:");foreach(char item in alphabet){Console.WriteLine(item);}//第二次是出栈一个输出一个 等循环结束的时候 栈为空Console.WriteLine("Second:");while(alphabet.Count > 0){char x = alphabet.Pop();Console.WriteLine(x);}return 0;}}}


0 0
原创粉丝点击