2016-05-19 2 views
0

Я делаю упражнение, это текст: Функция принимает в качестве ввода очередь Q, пустой стек S и целое число k и вставляет первые k элементов Q в S, так что элемент на фронте Q находится в верхней части S, а k-й элемент Q находится на дне S. Например, если Q = < 6,8,7,15,20,9 >, где 6 - элемент спереди, то после вызова вставки (Q, S, 4) имеем S = < 6,8,7,15>, где 6 - элемент сверху. Я не могу использовать какую-либо структуру данных. Это мое решение, но не работает должным образом, вставить элементы в неправильном порядке ...Вставить элементы очереди в стек java

public static void main(String[] args) { 

    Queue<String>Q=new ArrayQueue<String>(); 
    Stack<String>S=new ArrayStack<String>(); 
    Q.enqueue("Bob"); 
    Q.enqueue("Tom"); 
    Q.enqueue("Ann"); 
    Q.enqueue("Bill"); 
    Q.enqueue("David"); 
    Q.enqueue("Mary"); 
    Q.enqueue("Bob"); 
    Q.enqueue("Jane");*/ 

    for(int k=1;k<=9;k++){ 
     insert(Q,S,k); 
     System.out.print("Dopo aver invocato insert con k="+k +", S = < "); 
     while(!S.isEmpty()) 
     System.out.print(S.pop()+" "); 
     System.out.println(">"); 
    } 
} 

public static <E>void insert(Queue<E> Q,Stack<E> S, int k){ 
     int sizeOfQ=Q.size(); 
     if(sizeOfQ<k) 
      return; 
     for(int i=0;i<k;i++){ 
      E elt=Q.dequeue(); 
      Q.enqueue(elt); 
     } 
     for(int i=0;i<sizeOfQ;i++){ 
      E elt=Q.dequeue(); 
      if(i>=sizeOfQ-k){ 
       S.push(elt); 
       Q.enqueue(elt); 
      }else{ 
       Q.enqueue(elt); 
      } 
     } 
     for(int i=0;i<sizeOfQ-k;i++){ 
      Q.enqueue(Q.dequeue()); 
     } 
+0

Не могли бы вы выделить пакет для очереди? Это не может быть java.util.Queue, так как нет метода детекции. – mauros

+0

Да не из java util ... http: //pastebin.com/6dQpXd0p это ArrayQueue –

+0

Импорт важен так же, как и код ... ваш ArrayQueue не компилируется ... и я могу также использовать ArrayStack ? – mauros

ответ

0

Очевидно, что это своего рода экзамен, поэтому я не могу дать вам прямой ответ.

Что я могу сделать, это показать вам направление поиска решения.


Попытка написать эту проблему в другой форме:

  • Если к 0 возврат пустой стек
  • Если к 1 возврата стек с первым элементом очереди
  • Если k равно 2, и элемент перед очередью A и B возвращает стек с B внизу и A вверху, поэтому вам нужно вставить первый B и второй A
  • Если k равно 45 и элемент перед que ue является A, вам необходимо вставить A, а затем вставить в обратном порядке остальные 44 элемента

Написанный в этой форме, он решает алгоритм рекурсии. Не так ли?

Если вы можете использовать рекурсию, эта проблема очень проста.

Возьмите только во внимание два момента:

  • Что происходит с вашей очереди Q? Его можно изменить? Или в конце процесса вам нужно иметь оригинальный Q?
  • Что произойдет, если k больше размера Q? Возвращает исключение? возвращает стек для всех элементов Q

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

+0

Моя очередь должна быть оригинальной Q в конце процесса, если k больше, у меня нет инструкций. –

+0

Вы можете использовать дополнительные структуры данных? –

+0

нет я не могу использовать ... –

Смежные вопросы