持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情
栈的用途比较广 ,如:子进程调用,递归调用,表达式转换,二叉树遍历,深度优先搜索 等等。
使用泛型栈之前需要命名空间System.Collections.Generic
使用泛型可以减少装箱拆箱,而且若泛型类型为object,则泛型栈队列可以完全取代普通栈队列。
Stack<int> _s = new Stack<int>();
Queue<object> _q = new Queue<object>();
在其内部方法与使用上,与Stack和Queue一样。
举个例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
namespace HelloWorld
{
class MyStack<T>
{
T[] StackArray;
int StackPointer = 0;
public void Push(T x)
{
if (!IsStackFull)//如果不满栈
{
StackArray[StackPointer++] = x;
}
}
public T Pop()
{
return (!IsStackEmpty)//如果不是空栈,pop;如果是空栈,返回栈底
? StackArray[--StackPointer]
: StackArray[0];
}
const int MaxStack = 10;
bool IsStackFull { get { return StackPointer >= MaxStack; } }//判断是否满栈,满栈返回true
bool IsStackEmpty { get{ return StackPointer<=0;}}//判断是否空栈,空栈返回true
public MyStack()
{
StackArray=new T[MaxStack];
}
public void Print()
{
for (int i = StackPointer - 1; i >= 0; i--)
{
Console.WriteLine("Value: {0}",StackArray[i]);
}
}
}
class Program
{
static void Main(string[] args)
{
var stackInt = new MyStack<int>();
var stackString = new MyStack<string>();
stackInt.Push(3);
stackInt.Push(5);
stackInt.Push(7);
stackInt.Print();
stackString.Push("Generics are great!");
stackString.Push("Hi there!");
stackString.Print();
}
}
}
队列是其元素以先进先出(Firstin,Firstout,FIFO)的方式来处理的集合。先放入队列中的元素会先读取。队列使用System.Collections.Generic命名空间中的泛型类Queue实现。
队列的成员
Count:Count属性返回队列中元素个数。
Enqueue:Enqueue()方法在队列一端添加一个元素。
Dequeue:Dequeue()方法在队列的头部读取和删除元素。如果在调用Dequeue()方法时,队列中不再有元素,就抛出一个InvalidOperationException类型的异常。
Peek:Peek()方法从队列的头部读取一个元素,但不删除它。
TrimExcess:TrimExcess()方法重新设置队列的容量。Dequeue()方法从队列中删除元素,但它不会重新设置队列的容量。要从队列的头部去除空元素,应使用TrimExcess()方法。
Clear:Clear()方法从队列中移除所有的元素。
ToArray:ToArray()复制队列到一个新的数组中。