数据结构——队列

原文:http://www.cnblogs.com/skywang12345/p/3562279.html

队列的介绍

队列(Queue),是一种线性存储结构。它有以下几个特点:
(01) 队列中数据是按照"先进先出(FIFO, First-In-First-Out)"方式进出队列的。
(02) 队列只允许在"队首"进行删除操作,而在"队尾"进行插入操作。
队列通常包括的两种操作:入队列 出队列

 

1. 队列的示意图

队列中有10,20,30共3个数据。

 

2. 出队列

出队列前:队首是10,队尾是30。
出队列后:出队列(队首)之后。队首是20,队尾是30。

 

3. 入队列

入队列前:队首是20,队尾是30。
入队列后:40入队列(队尾)之后。队首是20,队尾是40。

 

队列的.NET实现

1. 实现一:数组实现的队列,能存储任意类型的数据。
2. 实现二:Java的 Collection集合 中自带的"队列"(LinkedList)的示例。

 

1.实现一:数组实现的队列,能存储任意类型的数据

 

    /// <summary>
    /// 数组实现“队列”,只能存储int数据。
    /// </summary>
    public class ArrayQueue
    {

        private int[] mArray;
        private int mCount;

        public ArrayQueue(int sz)
        {
            mArray = new int[sz];
            mCount = 0;
        }

        // 将val添加到队列的末尾
        public void add(int val)
        {
            mArray[mCount++] = val;
        }

        // 返回“队列开头元素”
        public int front()
        {
            return mArray[0];
        }

        // 返回“队首值”,并删除“队首元素”
        public int pop()
        {
            int ret = mArray[0];
            mCount--;
            for (int i = 1; i <= mCount; i++)
                mArray[i - 1] = mArray[i];
            return ret;
        }

        // 返回“队列”的大小
        public int size()
        {
            return mCount;
        }

        // 返回“队列”是否为空
        public bool isEmpty()
        {
            return size() == 0;
        }

    }

 

 

 

运行结果

tmp=10
tmp=20
isEmpty()=false
size()=3
size()=20
size()=30
size()=40

结果说明:ArrayQueue是通过数组实现的队列,而且ArrayQueue中使用到了泛型,因此它支持任意类型的数据。

 

2. 实现二:Collection集合 中自带的"队列"(LinkedList)的示例

 

    /// <summary>
    ///  用“栈”实现队列
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class StackList<T>
    {

        // 向队列添加数据时:(01) 将“已有的全部数据”都移到mIn中。 (02) 将“新添加的数据”添加到mIn中。
        private Stack<T> mIn = null;
        // 从队列获取元素时:(01) 将“已有的全部数据”都移到mOut中。(02) 返回并删除mOut栈顶元素。
        private Stack<T> mOut = null;
        // 统计计数
        private int mCount = 0;

        public StackList()
        {
            mIn = new Stack<T>();
            mOut = new Stack<T>();
            mCount = 0;
        }

        public void add(T t)
        {
            // 将“已有的全部数据”都移到mIn中
            while (mOut.Count > 0)
                mIn.Push(mOut.Pop());

            // 将“新添加的数据”添加到mIn中
            mIn.Push(t);
            // 统计数+1
            mCount++;
        }

        public T get()
        {
            // 将“已有的全部数据”都移到mOut中
            while (mIn.Count > 0)
                mOut.Push(mIn.Pop());
            // 统计数-1
            mCount--;

            // 返回并删除mOut栈顶元素
            return mOut.Pop();
        }

        public int size()
        {
            return mCount;
        }
        public bool isEmpty()
        {
            return mCount == 0;
        }


    }

 

 

 

运行结果

tmp=10
tmp=20
isEmpty()=false
size()=3
tmp=20
tmp=30
tmp=40

 

posted @ 2019-02-17 18:37  luanxm  阅读(328)  评论(0编辑  收藏  举报