C#学习日记 队列 栈

队列,元素是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>();
		//在队列的队尾添加一个document
		public void AddDocument(Document doc)
		{
			lock(this)
			{
				documentQueue.Enqueue(doc);
			}
		}
		//在队列的头部取出document
		public 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;
			
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值