2016-07-22 59 views
1

好吧,我正在學java的暑期課程。是的,這是課堂上的任務,但我很難過,已經休息了一下,仍然無法理解邏輯錯誤是什麼。我將使用鏈接列表進行堆疊。外部和內部類應該在UserStack中實現。 UserStack實現由教師提供的MyStack。 StackApp的主要內容。它編譯並運行。它正確地要求輸入一個整數。將刪除,如果有東西要刪除,並會嘗試偷看,如果有東西要顯示。但它總是說它已刪除或正在顯示數字0.我是否需要嘗試執行toString重寫?我問我的教授,他告訴我像其他學生一樣去谷歌。Java Stack peek方法顯示0而不是正確的數字

MyStack.java

public interface MyStack 
{ 
    public void push (int item); 

    public int pop(); 

    public int peek(); 

    public boolean isEmpty(); 

} 

UserStack.java

import java.util.NoSuchElementException; 

public class UserStack implements MyStack 
{ 
    private class Node 
    { 
     public int value; 
     public Node link; 

     public Node(int data) 
     { 
      data = value; 
     } 
    } 

    private Node head = null; 

    public void push (int item) 
    { 
     Node newHead = new Node(item); 
     newHead.link = head; 
     head = newHead; 
    } 

    public int pop() 
    { 
     if(isEmpty()) 
      throw new NoSuchElementException(); 
     int tmp = head.value; 
     head = head.link; 

     return tmp; 
    } 

    public int peek() 
    { 
     if(isEmpty()) 
      throw new NoSuchElementException(); 

     int tmp = head.value; 

     return tmp; 
    } 

    public boolean isEmpty() 
    { 
     return head == null; 
    } 
} 

StackApp.java

import java.util.Scanner; 

class StackApp 
{ 
    UserStack stack = new UserStack(); 
    public void displayMenu() 
    { 
     System.out.println ("1) Add an integer to the list\n" + 
          "2) Remove last integer entered\n" + 
          "3) Look at last integer entered\n" + 
          "0) Exit the program"); 
     System.out.print ("Selection: "); 
    } 

    public StackApp() 
    { 
     int option; 
     Scanner input = new Scanner(System.in); 

     do{ 
     displayMenu(); 
     option = input.nextInt(); 

     switch (option) 
     { 
      case 1: 
       int number; 
       System.out.println("Enter integer to add: "); 
       number = input.nextInt(); 
       stack.push(number); 
       break; 
      case 2: 
       int number2 = stack.pop(); 
       System.out.println("Interger removed: " + number2); 
       break; 
      case 3: 
       int number3 = stack.peek(); 
       System.out.println("Next Interger: " + number3); 
       break; 
      case 0: 
       System.out.println("Goodbye"); 
       break; 
      default: 
       System.err.println("Unrecongized choice"); 
       break; 
     } 
     }while(option != 0); 
    } 

    public static void main(String[] args) 
    { 
     new StackApp(); 
    } 
} 
+2

Typo in your' Node'構造函數:'data = value;'應該是'value = data;'。 –

+0

非常感謝。自從週一以來我一直在盯着這個,從來沒有注意到這一點。 – GenCrash10

回答

0

你永遠不會設置新項目的value

+0

對我來說,這似乎相當明顯,問題不在於'push',而是在'Node'構造函數中...... –

+0

對於初學者來說,對於專家來說顯而易見的東西可能不是什麼。 – SomeStudent

+0

@SomeStudent喬恩指的是這個答案的以前的狀態。 – EJP

-1

伴侶,嘗試在您的節點構造圍繞你的價值分配切換:

原文:

public Node(int data) 
     { 
      data = value; 
     } 

新:

public Node(int data) 
     { 
      this.value = data; 
     } 

另外,關鍵字的使用 「這」因爲您正在讓程序知道我們要將此類級變量「值」設置爲數據值。因此,您必須使用關鍵字「this」。我相當肯定你的任務有點偏離,因爲你設置的「數據」等於「值」,並且,因爲值從未有明確設置的初始值,所以它默認爲0.

+0

在這裏使用'this' *不是必須的,儘管我同意這是在構造函數中的一個好習慣,就像使用同樣的參數名一樣。 – EJP