转载——用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,则转换后的结果为:
浙公网安备 33010602011771号