Метод удаления из очереди C#

#c#

#c#

Вопрос:

Я разработал простое приложение Windows forms, в котором пользователь вводит свое имя и нажимает «Добавить», что добавит его имя в очередь. Также есть кнопка удаления, при нажатии которой его имя выводится из очереди.

Препятствие, с которым я сталкиваюсь, заключается в том, что при удалении из очереди значение «head» увеличивается, как и ожидалось, а numItem уменьшается, как и ожидалось, но имя не удаляется из очереди.

Код:

Класс очереди:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AssessedExerciseWeek1_2_Task1A
{
    class Queue
    {
        private readonly int maxsize = 10;
        private string[] store;
        private int head = 0;
        private int tail = 0;
        private int numItems;

        public Queue()
        {
            store = new string[maxsize];
        }

        public Queue(int size)
        {
            maxsize = size;
            store = new string[maxsize];
        }

        public void Enqueue(string value)
        {
            numItems  ;
            store[tail] = value;
            if (  tail == maxsize)
            {
                tail = 0;
            }
        }

        public string Dequeue()
        {
            string headItem;
            numItems--;
            headItem = store[head];
            if (  head == maxsize)
            {
                head = 0;
            }

            return headItem;

        }

        public bool IsEmpty()
        {
            return tail == 0; //returns the boolean result of the comparison between head and 0
        }

        public bool IsFull()
        {
            return tail == maxsize;
        }
        public int CountQueue() //counts the number of items inside the queue
        {
            return tail - head;
        }

        public int Tail //property
        {
            set { this.tail = value; }
            get { return tail; }
        }

    }
}

  

Удалить код кнопки:

 
private void RemoveButton_Click(object sender, EventArgs e)
        {
            names.Dequeue(); //names is a new instance of the queue (declared on top of the windows form code)
        }

  
  

Комментарии:

1. Именно так вы его запрограммировали. Добавление хранилища [head] = null; для удаления из очереди() не требуется, оно в конечном итоге будет перезаписано. Вместо этого сосредоточьтесь на обеспечении безопасности, защите от вызова функции Dequeue(), когда функция Enqueue() не вызывалась, и слишком частого вызова функции Enqueue().

2. В качестве альтернативы вы могли бы просто использовать Queue<int> , если это не HW, который требует, чтобы вы написали свою собственную очередь.

3. @juharr Я должен написать свою собственную очередь

4. Рассматривали ли вы возможность использования связанного списка? Таким образом, вам нужен только указатель на элементы head и tail, и каждый элемент очереди содержит указатель на следующий.

5. @HansPassant Извините, но я не понимаю, почему имя не удаляется из очереди

Ответ №1:

Реализация этого с помощью массивов — не лучший вариант, но если вы хотите это сделать, то проблема в том, что вы не определяете способ теперь, если «пробел» массива пуст. Я использовал null для достижения этой цели. Измените свой метод удаления из очереди на этот:

     public string Dequeue()
    {
        string headItem;
        headItem = store[head];
        if (headItem != null)
        {
            store[head] = null;
            numItems--;
            if (  head == maxsize)           
                head = 0;           
        }
   
        return headItem ?? "There are no more objects in the queue";
    }
  

Вероятно, вам следует рассмотреть возможность добавления проверки в ваш метод Enqueue(), чтобы убедиться, что новые строки не добавляются, если их массив заполнен, потому что в настоящее время ваш первый элемент перезаписывается при превышении максимального размера.

Кроме того, проверьте различные способы реализации этого, например, использование LinkedList, как предложено в комментариях, или создание собственного класса Node для «подключения» объектов.