数据结构——队列

本文详细介绍了队列这一线性存储结构的特点及工作原理,重点讲解了队列的先进先出特性,并提供了两种.NET实现队列的方法:一是通过数组实现,能够存储任意类型的数据;二是利用Java的Collection集合中的LinkedList来实现队列。

原文: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

 

转载于:https://www.cnblogs.com/luanxm/p/10392177.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值