zoukankan      html  css  js  c++  java
  • C#数组和链表实现队列

      //基于数组的队列实现
        public class MyArrayQueue<T>
        {
            private T[] items;
            private int size;
            private int head;
            private int tail;
    
            public MyArrayQueue(int capacity)
            {
                this.items = new T[capacity];
                this.size = 0;
                this.head = this.tail = 0;
            }
    
            /// <summary>
            /// 入队
            /// </summary>
            /// <param name="item">入队元素</param>
            public void EnQueue(T item)
            {
                if (Size == items.Length)
                    // 扩大数组容量
                    ResizeCapacity(items.Length * 2);
                items[tail] = item;
                tail++;
                size++;
            }
            /// <summary>v 
            /// 出队
            /// </summary>
            /// <returns>出队元素</returns>
            public T DeQueue()
            {
                if (size == 0) return default(T);
                T item = items[head];
                items[head] = default(T);
                head++;
                if (head > 0 && Size == items.Length / 4)
                    ResizeCapacity(items.Length / 2);
    
                size--;
                return item;
            }
    
            /// <summary>
            /// 重置数组大小
            /// </summary>
            /// <param name="newCapacity">新的容量</param>
            public void ResizeCapacity(int newCapacity)
            {
                T[] newItems = new T[newCapacity];
                int index = 0;
                if (newCapacity > items.Length)
                {
                    for (int i = 0; i < items.Length; i++)
                        newItems[index++] = items[i];
                }
                else
                {
                    for (int i = 0; i < items.Length; i++)
                    {
                        if (!items[i].Equals(default(T)))
                        {
                            newItems[index++] = items[i];
                        }
                    }
                    head = tail = 0;
                }
                items = newItems;
            }
            /// <summary>
            /// 栈是否为空
            /// </summary>
            /// <returns>true/false</returns>
            public bool IsEmpty()
            {
                return this.size == 0;
            }
    
            /// <summary>
            /// 栈中节点个数
            /// </summary>
            public int Size
            {
                get
                {
                    return this.size;
                }
            }
        }
    

      

    public class Node<T>
        {
            public T Item { get; set; }
            public Node<T> Next { get; set; }
    
            public Node(T item)
            {
                this.Item = item;
            }
    
            public Node()
            { }
        }
    
        /// <summary>
        /// 基于链表的队列实现
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        public class MyLinkQueue<T>
        {
            private Node<T> head;
            private Node<T> tail;
            private int size;
    
            public MyLinkQueue()
            {
                this.head = null;
                this.tail = null;
                this.size = 0;
            }
    
            /// <summary>
            /// 入队操作
            /// </summary>
            /// <param name="node">节点元素</param>
            public void EnQueue(T item)
            {
                Node<T> oldLastNode = tail;
                tail = new Node<T>();
                tail.Item = item;
    
                if (IsEmpty())
                {
                    head = tail;
                }
                else
                {
                    oldLastNode.Next = tail;
                }
    
                size++;
            }
    
            /// <summary>
            /// 出队操作
            /// </summary>
            /// <returns>出队元素</returns>
            public T DeQueue()
            {
                T result = head.Item;
                head = head.Next;
                size--;
    
                if (IsEmpty())
                {
                    tail = null;
                }
                return result;
            }
    
            /// <summary>
            /// 是否为空队列
            /// </summary>
            /// <returns>true/false</returns>
            public bool IsEmpty()
            {
                return this.size == 0;
            }
    
            /// <summary>
            /// 队列中节点个数
            /// </summary>
            public int Size
            {
                get
                {
                    return this.size;
                }
            }
        }
    

      

     class Program
        {
            static void Main(string[] args)
            {
                // 01.基于链表的队列
                QueueWithLinkListTest();
                // 02.基于数组的队列
                //QueueWithArrayTest();
            }
            #region Method01.基于链表的队列的测试
            /// <summary>
            /// 基于链表的队列的测试
            /// </summary>
            static void QueueWithLinkListTest()
            {
                MyLinkQueue<int> queue = new MyLinkQueue<int>();
                Console.WriteLine("Is Empty:{0}", queue.IsEmpty());
                Random rand = new Random();
                // 顺序插入5个元素
                for (int i = 0; i < 5; i++)
                {
                    int num = rand.Next(1, 10);
                    queue.EnQueue(num);
                    Console.WriteLine("{0} enqueue.", num);
                }
                Console.WriteLine("Size:{0}", queue.Size);
                Console.WriteLine("-------------------------");
                // 5个元素依次出队
                for (int i = 0; i < 5; i++)
                {
                    Console.WriteLine("{0} dequeue.", queue.DeQueue());
                }
                Console.WriteLine("Size:{0}", queue.Size);
                Console.WriteLine("-------------------------");
                // 顺序插入10个元素
                for (int i = 0; i < 10; i++)
                {
                    int num = rand.Next(1, 10);
                    queue.EnQueue(num);
                    Console.WriteLine("{0} enqueue.", num);
                }
                Console.WriteLine("Size:{0}", queue.Size);
                Console.WriteLine("-------------------------");
                // 10个元素依次出队
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine("{0} dequeue.", queue.DeQueue());
                }
                Console.WriteLine("Size:{0}", queue.Size);
            }
            #endregion
    
            #region Method02.基于数组的队列的测试
            /// <summary>
            /// 基于数组的队列的测试
            /// </summary>
            static void QueueWithArrayTest()
            {
                MyArrayQueue<int> queue = new MyArrayQueue<int>(5);
                Console.WriteLine("Is Empty:{0}", queue.IsEmpty());
                Console.WriteLine("Size:{0}", queue.Size);
    
                Random rand = new Random();
                // Test1.1:顺序插入5个数据元素
                for (int i = 0; i < 5; i++)
                {
                    int num = rand.Next(1, 10);
                    queue.EnQueue(num);
                    Console.WriteLine("{0} enqueue.", num);
                }
                Console.WriteLine("Is Empty:{0}", queue.IsEmpty());
                Console.WriteLine("Size:{0}", queue.Size);
                // Test1.2:临时插入1个数据元素验证数组是否扩容
                queue.EnQueue(rand.Next(1, 20));
                Console.WriteLine("Size:{0}", queue.Size);
                Console.WriteLine("-------------------------");
                // Test2.1:前5个元素出队
                for (int i = 0; i < 5; i++)
                {
                    Console.WriteLine("{0} dequeue.", queue.DeQueue());
                }
                Console.WriteLine("Is Empty:{0}", queue.IsEmpty());
                Console.WriteLine("Size:{0}", queue.Size);
                Console.WriteLine("-------------------------");
                // Test2.2:最后一个数据元素出队验证数组是否收缩容量
                queue.DeQueue();
                Console.WriteLine("Size:{0}", queue.Size);
                Console.WriteLine("-------------------------");
                queue.DeQueue();
            }
            #endregion
        }
    

      

  • 相关阅读:
    C# Lambda表达式 (转)
    用C#读取txt文件的方法(转)
    c#中stringbuilder的使用(转)
    c# 日期和时间的获取(转)
    C# List<T>用法 泛型 (转)
    indent format codes
    格式化输入输出 小结
    putty connection manager 一些问题的整理
    linux 网络的一些书籍
    Oracle学习笔记
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/12985426.html
Copyright © 2011-2022 走看看