转载——用C#学数据结构(7)

 第三章   栈和队列

栈的操作只能在表的一端进行。

队列的插入操作在表的一端进行而其它操作在表的另一端进行。

栈和队列是操作受限的线性表。

栈(Stack)是操作限定在表的尾端进行的线性表。表尾由于要进行插入、删除等操作,表尾称为栈顶(Top),另一端是固定的叫栈底(Bottom)。当栈中没有数据元素时叫空栈(Empty Stack)。

栈的操作是线性表操作的一个子集。

C#中的栈

       C#中使用Stack<T>泛型类来实现。Stack内部使用数组来实现,Stack 的容量默认初始容量为10。向Stack添加元素时,将通过重新分配内部数组,根据需要自动增大容量。可通过调用 TrimExcess 来减少容量。如果 Count 小于堆栈的容量,则 Push 为 O(1) 操作。如果需要增加容量以容纳新元素,则 Push 成为 O(n) 操作,其中 n 为 Count。Pop 为 O(1) 操作。Stack 接受空引用作为引用类型的有效值,并且允许有重复的元素。

Stack的属性和方法:

成员

说明

Count

获取Stack中包含的元素数

Clear

从Stack中移除所有对象

Contains

确定某元素是否在Stack中

GetEnumerator

返回Stack的一个枚举数

Peek

返回位于Stack顶部的对象但不将其移除

Pop

移除并返回位于Stack顶部的对象

Push

将对象插入Stack的顶部

ToArray

将Stack复制到新数组中

TrimExcess

如果元素数小于当前容量的90%,将容量设置为Stack中的实际元素数

应用实例:数制转换问题。数制转换问题是将任意一个非负的十进制数转换为其它进制的数,这是计算机实现计算的基本问题。一般的解决方法的利用辗转相除法。下面将提供一个函数实现将十进制数转化为2,8,16进制的函数。

/// <summary>

/// 将十进制数转化为其他进制数

/// </summary>

/// <param name="n">待转换十进制数</param>

/// <param name="s">转换类型,'B'则为二进制,'Q'为八进制,'H'为十六进制</param>

/// <returns>代表该进制的字符串</returns>

public static string Dec2Other(int n, char s)

{

    Stack<int> st = new Stack<int>();

    int baseNum = 10;

    switch (s)

    {

        case 'B': baseNum = 2; break;

        case 'Q': baseNum = 8; break;

        case 'H': baseNum = 16; break;

    }

    while (n > 0)

    {

        st.Push(n % baseNum);

        n = n / baseNum;

    }

    string result = "";

    while (st.Count > 0)

    {

        string c;

        int t = st.Pop();

        switch (t)

        {

            case 10: c = "A"; break;

            case 11: c = "B"; break;

            case 12: c = "C"; break;

            case 13: c = "D"; break;

            case 14: c = "E"; break;

            case 15: c = "F"; break;

            default: c = t.ToString(); break;

        }

        result += c;

    }

    return result;

}

       如果提供的十进制数是8086,则转换后的结果为:用C学数据结构(7) - Castor - 趁年轻,多折腾~~

 

posted on 2013-01-17 15:42  others  阅读(183)  评论(0)    收藏  举报

导航