2016-05-21 11 views
0

Okay, ich habe ein Programm zu erstellen, das if a Stack of CalendarDates is sorted or not. Der Parameter bestimmt den Stapel verwendet:Java: Verwirrung mit Stapeln

CalendarDate[] store = {new CalendarDate(1,2), new CalendarDate(1,1), new CalendarDate(12,30)}; 

So it will return false as (1,1) comes after (1,2).

Anyways, hier ist mein Code:

public static boolean isSorted(Stack<CalendarDate> c){ 
    Queue<CalendarDate> q = new LinkedList<CalendarDate>(); 

    CalendarDate peek = c.peek(); 

    while (!c.empty()){ 
     CalendarDate peeker = c.peek(); 
     if (peeker.compareTo(peek)>0){ 
      return false; 
     } 
     else{ 
      q.add(c.pop()); 
      peek=peeker; 
     } 
    } 
    while (!q.isEmpty()){ 
     c.push(q.remove()); 
    } 
    while(!c.empty()){ 
     q.add(c.pop()); 
    } 
    while(!q.isEmpty()){ 
     c.push(q.remove()); 
    } 
    return true; 
} 

Der einzige Fehler, den ich bekomme, ist in der 3. Zeile, wo ich CalendarDate peek = c.peek(); Es ist eine "emptystackexception"

Warum erhalte ich diesen Fehler?

+0

Sind Sie sicher, dass Ihr Stapel isn bist du leer? –

+4

Weil der Stapel zu dieser Zeit leer war ... Sie haben wahrscheinlich einen leeren Stapel an die Funktion übergeben. –

+0

Der Fehler ist sehr selbsterklärend. Überlege es nicht. – ChiefTwoPencils

Antwort

0

Da Stack ist Nachkomme List, können Sie Ihre algirithm schreiben, ohne Pop/Push/peek, iterieren nur den Stapel (die eine Liste ist) einen Iterator:

public static boolean isSorted(Stack<CalendarDate> c){ 

    Iterator<CalendarDate> it = c.iterator(); 
    CalendarDate lastItem = null; 

    while(it.hasNext()){ 

     CalendarDate currentItem = it.next(); 

     if(lastItem != null && lastItem.compareTo(currentItem) > 0){ 
      return false; 
     } 

     lastItem = currentItem; 
    } 

    return true; 
}