.Net中队列类的操作与系统队列类queue的使用

    class MyQueue
    {
        //存放元素的数组
        private object[] _array;
        //增长因子
        private int _growFactor;

        //队头下标
        private int _head;
        //队尾下标
        private int _tail;
        private int _size;

        private const int _MinGrow = 4;
        //初始容量
        private const int _ShrikThreadhold = 0x20;

        public MyQueue()
            : this(_ShrikThreadhold, 2f)
        {
        }

        public MyQueue(int capacity, float growFactor)
        {
            if (capacity < 0)
            {
                throw new ArgumentOutOfRangeException("capacity", "初始容量不能为负!");
            }
            if ((growFactor < 1.0) || (growFactor > 10))
            {
                throw new ArgumentOutOfRangeException("growFactor", "增长因子应介于1和10之间!");
            }
            this._array = new object[capacity];
            this._head = 0;
            this._size = 0;
            this._tail = 0;
            this._growFactor = (int)(growFactor * 100f);
        }

        //入队
        public virtual void Enqueue(object obj)
        {

            if (this._size == this._array.Length)
            {//队列已满
                int capacity = (int)((this._array.Length * this._growFactor) / 100L);
                if (capacity < (this._array.Length + _MinGrow))
                {
                    capacity = this._array.Length + _MinGrow;
                }
                SetCapacity(capacity);
            }
            this._array[this._tail] = obj;
            this._tail = (this._tail + 1) % this._array.Length;
            this._size++;
        }

        //内存设置
        private void SetCapacity(int capacity)
        {
            object[] dest = new object[capacity];
            if (this._head < this._tail)//尾指针在头指针后
            {
                Array.Copy(this._array, this._head, dest, 0, this._size);
            }
            else//头指针在尾指针后
            {
                Array.Copy(this._array, this._head, dest, 0, this._array.Length - this._head);
                Array.Copy(this._array, 0, dest, this._array.Length - this._head, this._tail);
            }

            this._array = dest;
            this._head = 0;
            this._tail = (this._size == capacity) ? 0 : this._size;
        }

        //出队
        public virtual object Dequeue()
        {
            if (this._size == 0)
            {
                throw new InvalidOperationException("队列为空");

            }
            object obj = this._array[this._head];//出队
            this._array[this._head] = null;
            this._head = (this._head + 1) % this._array.Length;
            this._size--;
            return obj;
        }
        public virtual int Count
        {
            get { return this._size; }
        }
    }
        static void Main(string[] args)
        {

            Program main = new Program();
            main.testQueue();
        }
        private void testQueue()
        {
            Queue<int> myQueue = new Queue<int>();
            //MyQueue myQueue = new MyQueue();//与上面类使用一样
            myQueue.Enqueue(1);
            myQueue.Enqueue(2);
            myQueue.Enqueue(3);
            myQueue.Enqueue(4);

            Console.WriteLine("总数量:"+myQueue.Count.ToString());
            while (myQueue.Count > 0)
            {
                Console.WriteLine("出列:"+myQueue.Dequeue());
            }
            Console.WriteLine("数量:"+myQueue.Count.ToString());
            Console.ReadLine();
        }

时间: 2024-08-03 13:35:14

.Net中队列类的操作与系统队列类queue的使用的相关文章

IBM WebSphere MQ创建队列管理器前的系统级操作

您可以通过本文了解 z/OS 的子系统基本配置和启动流程,以及 MQ 需要的所有定制化操作.作为该系列的第 1 部分,本文着重介绍创建队列管理器前的系统级操作. IBM 主机及其之上的 z/OS 操作系统,是在上世纪 60 年代 IBM 主机平台之上不断积累进化的产物.发展到今日,该环境已经演变为如今商业计算领域最为高效.稳定.可靠的计算机 IT 环境之一.如今,越来越多的银行.金融.电信.交通等行业领域意识到主机系统相比于开放式服务器系统的优势,并投入到主机的怀抱中来. 此外,IBM WebS

我用vs2005+sql2000做了一个系统,现在想将所有sql中更新、删除操作都记录下来,并将改的时间和修改人姓名都保存起来,怎么做?给个思路

问题描述 我用vs2005+sql2000做了一个系统,现在想将所有sql中更新.删除操作都记录下来,并将改的时间和修改人姓名都保存起来,怎么做?给个思路.比如一个页面,由张三修改了,自动将修改的记录记录下来,软件的页面很多,不想一个一个去写,想找一个简单的方法,听说sql中触发器可以做到,请高手指点. 解决方案 解决方案二:你可以使用触发器,但是你的每个表里都能记录操作用户信息么?触发器可以记录修改前和修改后还有修改时间解决方案三:在系统中定义一个用于写记录的类同时定义一个静态类该静态类知道当

ios-在Xcode中如何实现共享类的操作?

问题描述 在Xcode中如何实现共享类的操作? 具体描述问题: 有两个viewcontrollers,Viewcontroller1和viewcontroller2 ,我已经声明了一个全局变量,用在了两个view中,现在我需要调取view1中的变量值到view2中,怎么实现?先谢谢了. 解决方案 你可以通过创建一个shareclass,声明变量,然后就可以在viewcontroller1和viewcontroller2中导入sharedClass.h,这样就可以了 或者可以不创建共享class

php中pdf word excel操作类分享

1,php excelreader操作excel的php类,生成,读取excel等.功能很强大. 下载地址:http://sourceforge.net/projects/phpexcelreader/ 解压后,里面有很多例子,调用方法简单. 例1  代码如下 复制代码 <?php /**  *  * @copyright 2007-2012 Xiaoqiang.  * @author Xiaoqiang.Wu <jamblues@gmail.com>  * @version 1.01

sqlserver-尝试写了一个 JDBC 操作 SQLServer 的工具类,但是好像有问题,求大神帮忙指正

问题描述 尝试写了一个 JDBC 操作 SQLServer 的工具类,但是好像有问题,求大神帮忙指正 java新人,尝试写了一个 JDBC 操作 SQLServer 的工具类,但是好像有问题,调用 insert 指令没问题,而 select 指令出现如下报错: com.microsoft.sqlserver.jdbc.SQLServerException: ')' 附近有语法错误. at com.microsoft.sqlserver.jdbc.SQLServerException.makeFr

Android实现从缓存中读取图片与异步加载功能类_Android

本文实例讲述了Android实现从缓存中读取图片与异步加载功能类.分享给大家供大家参考,具体如下: 在新浪微博的微博列表中的图片,为了加速其显示也为了加快程序的响应,可以参考该图片异步加载类实现. public class AsyncImageLoader { //SoftReference是软引用,是为了更好的为了系统回收变量 private HashMap<String, SoftReference<Drawable>> imageCache; public AsyncImag

PHP类和对象相关系统函数与运算符小结_php技巧

本文总结了PHP类和对象相关系统函数与运算符.分享给大家供大家参考,具体如下: 系统函数 class_exists() 判断某个类是否存在 interface_exists() 判断接口是否存在 get_class() / __CLASS__ 获取某个对象所处的类名 get_parent_class() 获取某个对象所属父类的类名 get_class_methods() 获取一个类所有方法,返回索引数组 get_class_vars() 获取一个类所有属性,下标为属性名 get_declared

解析Java中的队列和用LinkedList集合模拟队列的方法_java

API中对队列的说明:   public interface Queue<E> extends Collection<E> 在处理元素前用于保存元素的 collection.除了基本的 Collection 操作外,队列还提供其他的插入.提取和检查操作.每个方法都存在两种形式:一种抛出异常(操作失败时),另一种返回一个特殊值(null 或 false,具体取决于操作).插入操作的后一种形式是用于专门为有容量限制的 Queue 实现设计的:在大多数实现中,插入操作不会失败. 队列通常

Android实现从缓存中读取图片与异步加载功能类

本文实例讲述了Android实现从缓存中读取图片与异步加载功能类.分享给大家供大家参考,具体如下: 在新浪微博的微博列表中的图片,为了加速其显示也为了加快程序的响应,可以参考该图片异步加载类实现. public class AsyncImageLoader { //SoftReference是软引用,是为了更好的为了系统回收变量 private HashMap<String, SoftReference<Drawable>> imageCache; public AsyncImag