#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 для «подключения» объектов.