本篇,我们介绍一种利用线性表创建的一种数据结构 —— 栈(Stacks)。
只要我们遇到回滚或者反转之类的问题,我们就可以使用栈来解决。
Reversing a String public  string  ReverseString (string  input ) {     if  (input == null )     {         throw  new  ArgumentNullException();     }     var  stack = new  Stack<char >();     foreach  (var  ch in  input)     {            stack.Push(ch);     }     var  sb = new  StringBuilder();     while  (stack.Count != 0 )     {         sb.Append(stack.Pop());     }     return  sb.ToString(); }
 
Balanced Expressions private  readonly  List<char > _leftBracketList = new  List<char > { '<' , '(' , '[' , '{'  };private  readonly  List<char > _rightBracketList = new  List<char > { '>' , ')' , ']' , '}'  };private  bool  IsLeftBracket (char  ch ) {     return  _leftBracketList.Contains(ch); }private  bool  IsRightBracket (char  ch ) {     return  _rightBracketList.Contains(ch); }private  bool  BracketsMatch (char  left, char  right ) {     return  _leftBracketList.IndexOf(left) == _rightBracketList.IndexOf(right); }public  bool  BalancedExpressions (string  expression ) {     var  stack = new  Stack<char >();     foreach  (var  ch in  expression)     {         if  (IsLeftBracket(ch))         {             stack.Push(ch);         }         else  if  (IsRightBracket(ch))         {             if  (stack.Count == 0 ) return  false ;             var  top = stack.Pop();             if  (!BracketsMatch(top, ch))             {                 return  false ;             }         }     }     return  stack.Count == 0 ; }
 
自己构建一个栈 public  class  Stack <T > {     private  readonly  T[] _stack;     private  int  _size;     public  Stack (int  capacity )     {         _stack = new  T[capacity];     }     public  void  Push (T item )     {         if  (_size == _stack.Length)         {             throw  new  StackOverflowException();         }         _stack[_size++] = item;     }     public  T Pop ( )     {         if  (IsEmpty())         {             throw  new  InvalidOperationException();         }         return  _stack[--_size];     }     public  T Peek ( )     {         if  (IsEmpty())         {             throw  new  InvalidOperationException();         }         return  _stack[_size - 1 ];     }     public  bool  IsEmpty ( )     {         return  _size == 0 ;     }     public  override  string  ToString ( )     {         var  t = new  T[_size];         Array.Copy(_stack, t, _size);         return  $"[{string .Join(", " , t)} ]" ;     } }