泛型栈和队列

简介: 泛型栈和队列

栈的用途比较广 ,如:子进程调用,递归调用,表达式转换,二叉树遍历,深度优先搜索 等等。

使用泛型栈之前需要命名空间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()复制队列到一个新的数组中。

目录
相关文章
|
9天前
|
算法 C语言
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
|
3天前
|
存储 缓存 算法
堆和栈的区别及应用场景
堆和栈的区别及应用场景
|
9天前
|
算法 C语言
【数据结构与算法 经典例题】使用队列实现栈(图文详解)
【数据结构与算法 经典例题】使用队列实现栈(图文详解)
|
2天前
|
存储 缓存 算法
堆和栈的区别及应用场景
堆和栈的区别及应用场景
|
3天前
|
算法
数据结构与算法:栈与队列
数据结构与算法:栈与队列
|
6天前
|
存储 算法 调度
算法与数据结构-栈篇
算法与数据结构-栈篇
12 0
|
7天前
|
存储 人工智能 程序员
技术心得记录:堆(heap)与栈(stack)的区别
技术心得记录:堆(heap)与栈(stack)的区别
|
9天前
【海贼王的数据航海】栈和队列
【海贼王的数据航海】栈和队列
6 0
|
9天前
|
存储 测试技术
【数据结构】操作受限的线性表,栈的具体实现
【数据结构】操作受限的线性表,栈的具体实现
19 5
|
10天前
|
算法
【C/数据结构和算法】:栈和队列
【C/数据结构和算法】:栈和队列
17 1