数据结构---队列

  interface IQueue<T>
    {
        int GetLength();
        bool IsEmpty();
        void Clear();
        void In(T item);
        T Out();
        T GetFront();
    }
  class Node<T>
    {
        private T data;
        private Node<T> next;

        public T Data { get => data; set => data = value; }
        public Node<T> Next { get => next; set => next = value; }
        public Node(T val, Node<T> p)
        {
            data = val;
            next = p;
        }
        public Node(T val)
        {
            data = val;
            next = null;
        }
        public Node(Node<T> p)
        {
            next = p;
        }
        public Node()
        {
            data = default(T);
            next = null;
        }
    }

//线性队列

  class SeqQueue<T> : IQueue<T>
    {
        private T[] data;
        private int count;
        private int front;//头
        private int rear;//尾
        public int Count
        {
            get{ return count; }
        }
        public int Front
        {
            get{return front; }
        }
        public int Rear
        {
            get{return rear;}
        }
        public T this[int i]
        {
            get{ return data[i];}
        }
        public SeqQueue(int size)
        {
            data = new T[size];
            count = 0;
            front = rear = -1;
        }
        public void Clear()
        {
            count = 0;
            front = rear = -1;
             Array.Clear(data, 0, data.Length);
        }

        public T GetFront()
        {
            return data[front + 1];
        }

        public int GetLength()
        {
            return count;
        }
        public bool IsFull()
        {
            if (count == data.Length)
            {
                Console.WriteLine("Queue is full!");
                return true;
            }
            else
            {
                return false;
            }

        }
        public void In(T time)//添加
        {
            if (IsFull())
            {
                Console.WriteLine("Queue is Full!");
                return;
            }
            else
            {
                if (rear == data.Length - 1)
                {
                    data[0] = time;
                    rear = 0;
                    ++count;
                }
                else
                {
                    data[++rear] = time;                   
                    ++count;
                }
            }
        }

        public bool IsEmpty()
        {
            return count == 0;
        }

        public T Out()//删除
        {
            if (count > 0)
            {
                T temp = data[front + 1];

                if (front < data.Length - 2)
                {
                    ++front;
                }
                else
                {
                    front = -1;
                }
                count--;
                return temp;
            }
            else
            {
                Console.WriteLine("Queue is empty!");
                return default(T);
            }
        }
    }

//单链 队列

 class LinkQueue<T> : IQueue<T>
    {
       private  Node<T> front;
        private Node<T> rear;
        private int count;
        public int Count { get => count;}
        internal Node<T> Front { get => front; set => front = value; }
        internal Node<T> Rear { get => rear; set => rear = value; }
        public LinkQueue()
        {
            front = null;
            rear = null;
            count = 0;
        }
        public void Clear()
        {
            front = null;
            rear = null;
            count = 0;
        }

        public T GetFront()
        {
            if (IsEmpty())
            {
                return default(T);
            }
            return front.Data;
        }

        public int GetLength()
        {
            return count;
        }
        public T  this[int i]
        {
            get
            {
                Node<T> temp = front;
                for (int j = 0; j < i; ++j)
                {
                    temp = temp.Next;
                }
                return temp.Data;               
            }
        }
        public void In(T item)
        {
            Node<T> q = new Node<T>(item);
            if (IsEmpty ())
            {
                front = q;
                rear = q;
                ++count;
            }
            else
            {
                rear.Next = q;
                rear = q;
                ++count;
            }
        }

        public bool IsEmpty()
        {
            return front == null; 
        }

        public T Out()
        {
            if (IsEmpty())
            {
                Console.WriteLine("队列为空 ");
                return default(T); 
            }
            else if (count == 1)
            {
                T temp = front.Data;
                front = null;
                rear = null;
                count = 0;
                return temp;
            }
            else
            {
                T temp = front.Data;
                front = front.Next;
                --count;
                return temp;
            }
        }
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卿屿­­­­­­­-轻尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值