简单改了一下网上的一段代码有个问题不明白 就是我第一次点按钮51  insert  queue2 len is:1
10  insert  queue2 len is:2
95  insert  queue2 len is:3
51  out     queue2 len is:2
10  out     queue2 len is:1
95  out     queue2 len is:0当再次,点击按钮时,,,就报错了,,在入队时  
  //入队
    public void In(object e)
    {
        if(IsFull())
        {
            //Console.WriteLine("队列已满!");
            MessageBox.Show("q is full");
            return;
        }
        data[++rear]=e;// 这句保持,数组溢出了
    }
   我不明白的是,,我初始化了队列大小为3,
   
   加了3 元素后,出了3个元素,,应该大小还是3个呀,怎么就不给加了呢?外部生命
  
Queue2 q = new Queue2(3);
按钮里的代码:
  
            int rdNum;
            Random rd = new Random();
            while (!q.IsFull())
            {
                //if (q.IsEmpty()) return;
                rdNum = rd.Next(10, 100);
                q.In(rdNum);
                this.txGet.AppendText(rdNum.ToString()+"insert" + "queue2 len is:"+q.GetQueueLength()+ "\r\n");             }            while (!q.IsEmpty())
            {              
                this.txGet.AppendText(q.Out() + "out" + "queue2 len is:" + q.GetQueueLength() + "\r\n"); 
            }      队列的类:class Queue2
{
    object[] data;  //数据元素
    int maxsize;    //最大容量
    int front;      //指向队头
    int rear;       //指向队尾
 
    //初始化队列
    public Queue2(int size)
    {
        this.maxsize = size;
        data = new object[size];
        front = rear = -1;
    }
    //最大容量属性
    public int MaxSize
    {
        get
        {
            return this.maxsize;
        }
        set
        {
            this.maxsize = value;
        }
    }
    //队尾属性
    public int Rear
    {
        get
        {
            return this.rear;
        }
    }
    //队头属性
    public int Front
    {
        get
        {
            return this.front;
        }
    }
    //数据属性
    public object this[int index]
    {
        get
        {
            return data[index];
        }
    }
    //获得队列的长度
    public int GetQueueLength()
    {
        return rear-front;
    }
    //判断队列是否满
    public bool IsFull()
    {
        if(GetQueueLength() == maxsize)
            return true;
        else
            return false;
    }
    //判断队列是否为空
    public bool IsEmpty()
    {
        if(rear==front)
            return true;
        else
            return false;
    }
    //清空队列
    public void ClearQueue()
    {
        rear = front = -1;
    }
    //入队
    public void In(object e)
    {
        if(IsFull())
        {            
            MessageBox.Show("队列已满!");
            return;
        }
        data[++rear]=e;
    }
    //出队
    public object Out()
    {
        if(IsEmpty())
        {
           MessageBox.Show("队列为空!");
            return null;
        }
        if(rear-front>0)
        {
            object tmp = data[++front];
            return tmp;
        }
        else
        {
            MessageBox.Show("全出队了!");
            ClearQueue();
            return null;
        }
    }
    //获得队头元素
    public object GetHead()
    {
        if(IsEmpty())
        {
           MessageBox.Show("队列为空!");
            return null;
        }
        return data[front+1];
    }
}}

解决方案 »

  1.   

    因为你每次入队的时候rear+1,出队的时候每次front+1
    当全部出队,rear=front=3,队列为空时,你没有重置rear和front,导致还是rear=front=3.
    当在点button时,你虽然有判断IsFull()
    public bool IsFull()
            {
                if (GetQueueLength() == maxsize)0!=3 所以返回false
                    return true;
                else
                    return false;
            }
    public int GetQueueLength()
            {
                return rear - front;//此时3-3=0
            }
    public void In(object e)
            {
                if (IsFull())//false
                {
                    MessageBox.Show("队列已满!");
                    return;
                }
                data[++rear] = e;
            }
      

  2.   

    上面说错是2不是3。
    主要原因是因为执行不到else,让队列清空,因为你外部 while (!q.IsEmpty()) rear=front时返回true,所以进不去else让rear和front重置。public object Out()
            {
                if (IsEmpty())
                {
                    MessageBox.Show("队列为空!");
                    return null;
                }
                if (rear - front > 0)
                {
                    object tmp = data[++front];
                    return tmp;
                }
                else
                {
                    MessageBox.Show("全出队了!");
                    ClearQueue();
                    return null;
                }
            }
      

  3.   

    你直接加
    public bool IsEmpty()
            {
                if (rear == front)
                {
                    ClearQueue();
                    return true;
                }
                else
                    return false;
            }
    多加个清空的就好了!