Почему метод pop в моем коде для стеков не выполняется? - PullRequest
0 голосов
/ 20 декабря 2018

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

import java.util.LinkedList;
import java.util.Queue;

public class StackWithQueues {

Queue<Integer> q1 = new LinkedList<Integer>();
Queue<Integer> q2 = new LinkedList<Integer>();
int size;

public StackWithQueues() {

    this.size = 0;

}

public void push(int ele) {

    q1.add(ele);
    size++;

    System.out.println("Pushed "+ele);
}

public void pop() {

    while(!q1.isEmpty()) {

        q2.add(q1.peek());
        q2.poll(); 

    }

    int popped = q2.peek();

    size--;
    q1 = q2;

    System.out.println("Popped "+popped);

}

public static void main(String[] args) {

    StackWithQueues s = new StackWithQueues();

    for(int i=0;i<5;i++)
        s.push(i+1);

    s.pop();
    s.pop();
    s.pop();


}

}

Я не могу понять, почему метод pop() ничего не делает.Консоль показывает следующий вывод при исполнении.

Нажатие 1
Нажатие 2
Нажатие 3
Нажатие 4
Нажатие 5

Буду признателен, если кто-нибудь сможет объяснить, что происходит с методом pop здесь.

1 Ответ

0 голосов
/ 20 декабря 2018

Ваш метод pop имеет бесконечный цикл.Он продолжает добавлять элементы в q2, не удаляя ничего из q1 (поскольку q1.peek() не удаляет заголовок очереди), поэтому q1 никогда не станет пустым.

Что-то вроде этого кажетсядля работы:

public void pop() {
    int popped = 0;
    while(!q1.isEmpty()) {

      popped = q1.poll ();
      if (!q1.isEmpty ()) {
        q2.add (popped);
      }
    }

    size--;
    Queue<Integer> temp = q1;
    q1 = q2;
    q2 = temp;

    System.out.println("Popped "+popped);
}

Обратите внимание, что по-прежнему отсутствует тест для пустого стека.

У вас было несколько проблем:

  1. Это стек, так что попдолжен возвращать последний отправленный элемент, а не первый.
  2. В первом всплывающем окне вы устанавливаете q1 = q2, и с этого момента у вас есть только 1 очередь.Вам следует создать новую пустую очередь для q2 (или присвоить ей исходную q1).
...