zoukankan      html  css  js  c++  java
  • C#中Stack<T>类的使用及部分成员函数的源代码分析

    Stack<T>类

    Stack<T> 作为数组来实现。

    Stack<T> 的容量是 Stack<T> 能够包括的元素数。

    当向 Stack<T> 中加入元素时,将通过又一次分配内部数组来依据须要自己主动增大容量。

    可通过调用 TrimExcess 来降低容量。 假设 Count 小于堆栈的容量,则 Push 的运算复杂度是 O(1)。 假设须要添加容量以容纳新元素,则 Push 的运算复杂度成为 O(n)。当中 n 为 Count。 Pop 的运算复杂度为 O(1)。

    Stack<T> 接受 null 作为引用类型的有效值而且同意有反复的元素。

    命名控件:System.Collections.Generic

    程序集:System(在System.dll中)

    语法:public class Stack<T>:IEnumerable<T>, ICollection, IEnumerable

    List<T>实现了IList<T>、 ICollection<T>、IEnumerable<T>、IList、ICollection、IEnumerable接口

    因此能够看出与List1T>相比:

    Stack<T>没有继承ICollection<T>接口,由于这个接口定义的Add()和Remove()方法不能用于栈;

    Stack<T>没有继承IList<T>接口,所以不能使用索引器訪问栈。

    所以队列仅仅同意在栈的顶部加入元素,删除元素。

    经常使用的Stack<T>类的成员:

    Count : 返回栈中元素的个数。

    Push(): 在栈顶加入一个元素。

    Pop() : 从栈顶删除一个元素。

    假设栈是空,就会抛出异常InvalidOperationException异常。

    Peek(): 返回栈顶的元素,但不删除它。

    Contains(): 确定某个元素是否在栈中。假设是,返回true。

    /******************************************************************************************************************************/

    经常使用Stack1T>类的成员函数的源代码例如以下:

    public bool Contains(T item)

    {

    int index = this._size;

    EqualityComparer<T> comparer = EqualityComparer<T>.Default;

    while (index-- > 0)

    {

    if (item == null)

    {

    if (this._array[index] == null)

    {

    return true;

    }

    }

    else if ((this._array[index] != null) && comparer.Equals(this._array[index], item))

    {

    return true;

    }

    }

    return false;

    }

    public T Peek()

    {

    if (this._size == 0)

    {

    ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EmptyStack);

    }

    return this._array[this._size - 1];

    }

    public T Pop()

    {

    if (this._size == 0)

    {

    ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EmptyStack);

    }

    this._version++;

    T local = this._array[--this._size];

    this._array[this._size] = default(T);

    return local;

    }

    public void Push(T item)

    {

    if (this._size == this._array.Length)

    {

    T[] destinationArray = new T[(this._array.Length == 0) ? 4 : (2 * this._array.Length)];

    Array.Copy(this._array, 0, destinationArray, 0, this._size);

    this._array = destinationArray;

    }

    this._array[this._size++] = item;

    this._version++;

    }

    /*****************************************************************************************************************************************/

    以下的代码演示样例演示了 Stack 泛型类的几种方法。 此代码演示样例创建具有默认容量的字符串堆栈,并使用 Push 方法将五个字符串压入堆栈。

    枚举堆栈的元素,这不会更改该堆栈的状态。

    使用 Pop 方法将第一个字符串弹出堆栈。 使用 Peek 方法查看此堆栈中的下一个项,然后使用 Pop 方法将其弹出。

    使用 ToArray 方法创建数组并将堆栈元素拷贝到当中,然后将数组传递给具有 IEnumerable 的 Stack 构造函数,以元素的反向顺序创建堆栈副本。

    将显示副本的元素。

    创建大小为堆栈大小两倍的数组,并使用 CopyTo 方法从数组的中间開始复制数组元素。

    再次使用 Stack 构造函数以元素的反向顺序创建堆栈副本;这样。三个空元素就位于堆栈的底部。

    使用 Contains 方法显示字符串“four”在第一个堆栈副本中。然后使用 Clear 方法清除该副本,并由 Count 属性显示此堆栈为空。

    using System;

    using System.Collections.Generic;

    class Example

    {

    public static void Main()

    {

    Stack<string> numbers = new Stack<string>();

    numbers.Push("one");

    numbers.Push("two");

    numbers.Push("three");

    numbers.Push("four");

    numbers.Push("five");

    // A stack can be enumerated without disturbing its contents.

    foreach( string number in numbers )

    {

    Console.WriteLine(number);

    }

    Console.WriteLine(" Popping '{0}'", numbers.Pop());

    Console.WriteLine("Peek at next item to destack: {0}", numbers.Peek());

    Console.WriteLine("Popping '{0}'", numbers.Pop());

    // Create a copy of the stack, using the ToArray method and the

    // constructor that accepts an IEnumerable.

    Stack stack2 = new Stack(numbers.ToArray());

    Console.WriteLine(" Contents of the first copy:");

    foreach( string number in stack2 )

    {

    Console.WriteLine(number);

    }

    // Create an array twice the size of the stack and copy the

    // elements of the stack, starting at the middle of the

    // array.

    string[] array2 = new string[numbers.Count * 2];

    numbers.CopyTo(array2, numbers.Count);

    // Create a second stack, using the constructor that accepts an

    // IEnumerable(Of T).

    Stack stack3 = new Stack(array2);

    Console.WriteLine(" Contents of the second copy, with duplicates and nulls:");

    foreach( string number in stack3 )

    {

    Console.WriteLine(number);

    }

    Console.WriteLine(" stack2.Contains("four") = {0}",stack2.Contains("four"));

    Console.WriteLine(" stack2.Clear()");

    stack2.Clear();

    Console.WriteLine(" stack2.Count = {0}", stack2.Count);

    }

    }

    /* This code example produces the following output:

    five

    four

    three

    two

    one

    Popping 'five'

    Peek at next item to destack: four

    Popping 'four'

    Contents of the first copy:

    one

    two

    three

    Contents of the second copy, with duplicates and nulls:

    one

    two

    three

    stack2.Contains("four") = False

    stack2.Clear()

    stack2.Count = 0

    */
  • 相关阅读:
    [C#] 了解过入口函数 Main() 吗?带你用批处理玩转 Main 函数
    [C#] C# 知识回顾
    [C#] C# 知识回顾
    [C#] C# 知识回顾
    [C#] C# 知识回顾
    [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密
    [C#] 简单的 Helper 封装 -- SecurityHelper 安全助手:封装加密算法(MD5、SHA、HMAC、DES、RSA)
    [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序
    [C#] 简单的 Helper 封装 -- RandomHelper
    [C#] 简单的 Helper 封装 -- CookieHelper
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7141317.html
Copyright © 2011-2022 走看看