2013-02-25 30 views
2

我正在嘗試將數據存儲到堆棧中。如果我錯了,請更正我,堆棧是Last in,first out類型。所以,我期待着我的計劃的輸出會有點逆轉。但可悲的是說輸出是不同的。我不確定哪部分代碼是錯誤的。java中的堆棧無法正常工作?

請幫忙:

CODE:

`

公共類CorruptQueue {

public static void LineUp(){ 

    BufferedReader br = null; 

try { 

    String line; 
    Stack nameStack = new Stack(); 
    Stack statusStack = new Stack(); 
    Stack stack = new Stack(); 

    br = new BufferedReader(new FileReader("C:/Users/user/Desktop/School Files/Project/CorruptOffice/input.txt")); 

    while ((line = br.readLine()) != null) { 


     StringTokenizer stringTokenizer = new StringTokenizer(line, " "); 

     while (stringTokenizer.hasMoreElements()) { 


     String lineup = stringTokenizer.nextElement().toString(); 
     String name = stringTokenizer.nextElement().toString(); 
     String status = stringTokenizer.nextElement().toString(); 



      nameStack.push(name); 
      statusStack.push(status); 
      System.out.println("Now serving "+ nameStack.pop() + " a " + statusStack.pop()); 



     /*StringBuilder sb = new StringBuilder(); 
     sb.append("" + lineup); 
     sb.append(" " + name); 
     sb.append("" + status); 
     sb.append("\n\n"); 

     System.out.println(sb.toString());*/ 
     } 

    } 

    System.out.println("Done"); 

} catch (IOException e) { 
    e.printStackTrace(); 
} finally { 
    try { 
     if (br != null) 
      br.close(); 

    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

    } 



public static void main(String[] args) 
{ 
    LineUp(); 

} }`

輸入:

陣容約翰經常

陣容鮑勃經常

陣容湯姆定期

陣容薩拉VIP

陣容瑪麗VIP

陣容瓊VIP

陣容衣VIP

陣容漢克經常

陣容藝術規律

陣容菊花VIP

陣容馬呂斯定期

陣容戴恩VIP

OUTPUT:

現在服務約翰經常

現在服務鮑勃定期

現在服務湯姆經常

現在服務莎拉VIP

現在服務瑪麗貴賓

現在服務瓊VIP

現在服務比亞貴賓

現在服務漢克常規

現在服務藝術定期

現在服務雛菊VIP

現在服務馬呂斯定期

現在服務戴恩貴賓

完成

+0

是您在你把它的順序輸入?即你推約翰,然後鮑勃..或者是什麼堆棧看起來像? – christopher 2013-02-25 16:15:52

回答

5
nameStack.push(name); 
    statusStack.push(status); 
    System.out.println("Now serving "+ nameStack.pop() + " a " + statusStack.pop()); 

確定。所以,你在說,把名字推到堆棧上。然後立即從堆棧中彈出該名稱。所以,是的,它是LIFO,但是你的堆棧中只有一個元素。嘗試在您的while循環之外完全移動彈出操作。然後有另一個while循環,它保持彈出元素,直到你的堆棧空了。

8

您的堆棧操作似乎是這裏

nameStack.push(name); 
statusStack.push(status); 
System.out.println("Now serving "+ nameStack.pop() + " a " + statusStack.pop()); 

現在,你的籌碼會被逆轉的名字,如果你把它們全都你開始彈出任何東西之前,但你推,並在同一時間彈出1項目一次。

因此實質上,您將namestatus推入堆棧,但在您反其他操作之前,您只需將它們彈出並將其打印到控制檯。

你的堆棧並沒有真正做任何事情。


如果你真的想扭轉你的輸出,採取

System.out.println("Now serving "+ nameStack.pop() + " a " + statusStack.pop()); 

了你最初的循環,然後把它放在一個新的循環。

1

您的代碼本節:

nameStack.push(name); 
statusStack.push(status); 
System.out.println("Now serving "+ nameStack.pop() + " a " + statusStack.pop()); 

你推一個值壓入堆棧,你再直客流行吧!你應該把它們全部推開,然後在全部打開之後將它們彈出。

這可能是在棧多一點值得reading up,只是爲了確保你瞭解他們:)

+0

TBH,我不認爲OP的問題是理解堆棧,而是理解基本的分步程序流程。 – mellamokb 2013-02-25 16:25:03

+0

我們都會不時做出愚蠢的錯誤。如果OP使用像堆棧這樣的數據結構,我想他們對程序流程有很好的把握。無論哪種方式,這個問題都得到了回答。 :) – christopher 2013-02-25 16:26:53