C# 栈=>随时读取栈中最小值
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //原理:利用两个栈,一个记录最小值,一个记录数据。 2 3 4 5 using System; 6 using System.Collections.Generic; 7 using System.Linq; 8 using System.Threading.Tasks; 9 10 namespace StackGetMinValues 11 { 12 public class Program 13 { 14 public void Main(string[] args) 15 { 16 MyStack myStack = new MyStack(); 17 myStack.Push(1); 18 myStack.Push(15); 19 myStack.Push(20); 20 myStack.Push(0); 21 myStack.Push(-10); 22 myStack.Push(50); 23 Console.WriteLine(myStack.GetMinValue()); 24 25 26 myStack.Pop(); 27 Console.WriteLine(myStack.GetMinValue()); 28 29 myStack.Pop(); 30 Console.WriteLine(myStack.GetMinValue()); 31 32 Console.ReadLine(); 33 34 } 35 36 } 37 public class MyStack 38 { 39 public Stack<int> stackData; 40 public Stack<int> stackMin; 41 public MyStack() 42 { 43 stackData = new Stack<int>(); 44 stackMin = new Stack<int>(); 45 } 46 public void Push(int number) 47 { 48 if (number.GetType() != typeof(int)) throw new ArgumentException("必须输入数字"); 49 50 51 if (stackData.Count() == 0) 52 { 53 stackData.Push(number); 54 stackMin.Push(number); 55 return; 56 } 57 58 stackData.Push(number); 59 if (stackMin.Peek() > number) 60 { 61 stackMin.Push(number); 62 } 63 } 64 public int Pop() 65 { 66 if (stackData.Count() == 0) throw new IndexOutOfRangeException("栈对象为空"); 67 var value = stackData.Pop(); 68 if (value == stackMin.Peek()) 69 { 70 stackMin.Pop(); 71 } 72 return value; 73 } 74 public int GetMinValue() 75 { 76 if (stackMin.Count() == 0) throw new IndexOutOfRangeException("最小值栈对象为空"); 77 78 return stackMin.Peek(); 79 } 80 } 81 }