ndas.net Ответов: 3

Связанные Списки C# : Реализация очереди


Привет,

Я хочу реализовать очередь, используя связанный список в C#.net но не стоит использовать стандартный контейнер, который доступен в C#. Эта очередь будет содержать PdfDocument и WordDocument объект.

Эта очередь имеет две функции: PUSH() который будет вставлять документы в очередь и POP() будет извлекать документы из очереди.

Если у кого-то есть какие-то идеи, пожалуйста, поделитесь со мной. Это будет высоко оценено

Спасибо.
Набхенду

[no name]

Что не так со стандартным "Queue<t>"? http://msdn.microsoft.com/en-us/library/7977ey2c.aspx

Если вы не объясните этого, мы не сможем помочь вам с решением....

Sergey Alexandrovich Kryukov

Не использование стандартного контейнера означает работу в учебных целях. Что толку, если кто-то даст вам решение? Кроме того, почему кто-то может быть заинтересован в этом? Поэтому, пожалуйста, сделайте это упражнение. Если вы столкнетесь с какими-либо проблемами, вы сможете получить помощь. Просто задай вопрос.
--СА

ndas.net

Я хочу разработать свой собственный базовый класс очереди...

Micha3ldg

Почему бы не использовать универсальную очередь? Ваш класс будет сильным типом.
http://msdn.microsoft.com/en-us/library/7977ey2c.aspx

3 Ответов

Рейтинг:
22

Manfred Rudolf Bihy

Как уже говорили другие, комментировавшие ваш вопрос, я тоже советую вам использовать стандартные классы, доступные в .NET. Но самое главное заключается в следующем:


  1. Push и Pop - это имена методов, которые несут коннотацию стека. Что-то "запихивают" в стопку и вынимают из нее с "хлопком". Стек-это структура данных, которая действует как ЛИФО какие средства ЛАСТ Ян Фпервый Оединое время. Самый последний выталкиваемый элемент будет выскочен перед любым элементом, который был выталкиваем до этого.
  2. Правильные имена методов для очереди - "Enqueue" для помещения элемента в очередь и "Dequeue" для извлечения элемента из очереди. Способ, которым это делается, называется В ПОРЯДКЕ ПОСТУПЛЕНИЯ, значение Фпервый Ян Фпервый Оединое время. Элемент А, который был помещен в очередь до элемента в, также будет удален из очереди до элемента В. (Когда речь идет о приоритетных очередях, есть тонкие различия, но вы всегда можете прочитать об этом позже.


Что касается того, как это реализовать:

  1. Вашему классу Queue потребуются две ссылки на экземпляры класса QueueElement.

    1. Направление связывания - от начала очереди до конца очереди
    2. Глава: Указывает на начало очереди, где будут удалены элементы (Dequeue)
    3. Хвост: Указывает на конец очереди, в которую будут добавлены элементы (Enqueue)

  2. Сделайте Queue и QueueElement универсальными, чтобы у вас была возможность создавать очереди для всех видов классов.
  3. Чтобы поставить элемент в очередь сделайте это:

    1. Создание экземпляра элемента QueueElement
    2. Сохраните элемент содержимого в элементе QueueElement
    3. Сделайте преемником элемента QueueElement, на который указывает хвостовая точка, только что созданный элемент QueueElement.
    4. Сделайте хвостовую ссылку очереди точкой на только что созданный элемент QueueElement.
    5. Если руководитель не имеет головы также указывать на тот же элемент, как хвост.

  4. Чтобы удалить элемент из очереди сделайте это:

    1. Храните головную ссылку в локальной переменной.
    2. Сделайте головную опорную точку элементом-преемником элемента head QueueElement.
    3. Элемент в конце связанного списка всегда имеет значение null в качестве своего преемника.
    4. Если в голове очереди является пустое множество, хвост также в null
    5. Возвращает ссылку, хранящуюся в локальной переменной.



Это более или менее так.

Счастливого кодирования!


CPallini

5.

[no name]

Хорошо сказано!

Рейтинг:
2

Naphstor

class Node {
  private int data {get; set;}
  public Node previous {get; set;}
  public Node (int val)
  {
    data = val;
    previous = null;
  }
}

class Queue {
  private Node Front, Rear, Prev = null;
  public Queue()
  {
    Front = Rear = null;
  }
  public void Enque(int val)
  {
    Node n = new Node(val);
    if (Prev == null)
    {
      Front = Rear = n;
    }
    else if (Front == Rear)
    {
      Rear.previous = n;
      Front = Rear.previous;
    }
    else
    {
      Front.previous = n;
      Front = Front.previous;
    }
  }
  public int Deque()
  {
    int val = Rear.data;
    Rear = Rear.previous;
    return val;
  }
}


Я еще не тестировал это решение, поэтому протестируйте его перед использованием. Кроме того, я сделал это в короткие сроки, так что если вы обнаружите какие-либо ошибки или какие-либо другие сбои, пожалуйста, дайте мне знать. Спасибо.


Рейтинг:
14

#realJSOP

Но почему вы "хотите" изобрести это колесо? То.Net framework уже имеет вполне работоспособный класс queue. Вы можете расширить его с помощью методов расширения и получить все преимущества полностью протестированного кода, фактически не проверяя базовую функциональность очереди. Какую функциональность вы хотите добавить, которой у него еще нет? Как вы думаете, что вы могли бы сделать лучше?


fjdiewornncalwe

Я полностью согласен с тем, что для практического, коммерческого развития нам не следует изобретать велосипед "потому что мы этого хотим". Но давайте будем честными... Я хочу сказать, что в детстве ты был похож на меня. Вы хотели разобрать все на части, чтобы посмотреть, как это работает. Этот мыслительный процесс также имеет ценность в развитии. Но, как я уже сказал, не в коммерческой среде.