泛型栈和队列

60 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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()复制队列到一个新的数组中。