2016-12-01 53 views
0

我正在嘗試使用java堆棧將字符串值:名稱導入到它中,派生自Scanner方法的輸入。然後,我想從堆棧中彈出名稱,並顯示堆棧的邏輯和物理元素。我相信我應該使用數組堆棧,但不完全確定,因爲我沒有太多的Stack或Stacks經驗。與字符串元素一起使用Java堆棧

當編譯Stack.java文件時出現以下錯誤。

Stack.java:24: cannot find symbol 
symbol : method push(java.lang.String) 
location: class java.lang.String[] 
stack.push(s); 

我一直在研究這個,日子嘗試不同的代碼,但我很新的這一點,我已經跑出去的方法來操作的代碼,使其工作。

我非常感謝一些建議...... tnx!

這裏是我的Stack類代碼:

import java.lang.*; 
import java.util.*; 

public class Stack { //Create Class 

     private String stack[] ; 
     private int top; 
     private static final int SIZE = 5; 
     String name; 
     Scanner scan = new Scanner(System.in); 

     public Stack(int SIZE){ 
      stack = new String [SIZE]; 
      top = 0; 
     } 

    public void push(String s) { //Method to Insert 

     if (isStackFull()) 
      System.out.println ("Stack is Full "); //If Stack full Print Full 
     else { 
      while (scan.hasNextLine()){ 
       s = scan.nextLine(); 
       stack.push(s); 
      } 
       stack[top] = s; 
       top++;  
     } 
    } 

    public String pop() { //Method to Delete 

     if (isStackEmpty()) 
      System.out.println ("Stack is Empty "); //If Stack empty print Empty 
     else{ 
      String value = stack[top]; 
      top--; 
      return value; 
     } 
     return stack[top]; 
    } 

    public String toString(){  //Method print Logical Stack 
      if (isStackEmpty()) 
       System.out.println ("Stack is Empty "); //If Stack empty print Empty 
      else 
       System.out.println("\nThe Stack"); 
       String result = ""; 

       for (int j=0; j < top; j++) 

        result = result + stack[j].toString() + "\n"; 

       return result; 
    } 

    public boolean isStackEmpty() { //Method boolean type to check empty Stack 
     return (top == 0); 
    } 

    public boolean isStackFull() {  //Method boolean type to check full Stack 
     return (top == (SIZE-1)); 
    } 
} 

對於StackTest代碼,一般我調用棧的方法。例如。

public class StackTest { //Create class 
    public static void main(String[] args){  //Main Method 
     Stack n = new Stack(); //Declare variables 
     Scanner in = new Scanner(System.in); 
     String response;       
     char x; 

while(x != 'q' && x != 'Q'){  //While loop initiates if no q or Q char input 

       switch(x){      //Start of swtich for insert, delete, print physical, logical or default quite 
        case 'i':     
         n.push();      
         System.out.println ("Inserted item from Stack"); 
         break; 
        case 'd': 
         n.pop(); 
         System.out.println ("Deleted item from Stack"); 
         break; 
        case 'p': 
         n.toString(); 
         System.out.println ("Printed Physical Stack "); 
         break; 
+0

'stack'是一個String數組,它沒有'push'方法。 – shmosel

+0

如果您需要一個不需要線程安全性的'Stack'實現,['ArrayDeque'](https://docs.oracle.com/javase/8/docs/api/java/util/ArrayDeque.html)是可取的。 – 4castle

回答

1

push(String s)是方法正在調用push()String這是不正確,而且對於push(String s)邏輯是複雜的,而它是簡單的在帶註釋的代碼如下所示:

public void push(String s) { 
    if (isStackFull()) 
     System.out.println ("Stack is Full "); //If Stack full Print Full 
    else { 
     stack[top] = s; //just add the string to the top of the stack 
     top++; //increment top 
    } 
} 
0

在push方法本身中,您正試圖調用stack.push,因此它會拋出錯誤。將stack.push替換爲堆棧[top_index] =字符串。

+0

Tnx所有!我會嘗試你的建議。 – ksdst1

+0

好的... tnx。在push方法中,我刪除了stack.push(s)調用,這解決了編譯錯誤。現在我在StackTest中有一個編譯錯誤,我不明白。它被掛在我的switch語句中:n.push() – ksdst1

+0

Tnx。在push方法中,我刪除了stack.push(s)調用,並修復了編譯錯誤。現在我在StackTest中有一個編譯錯誤。它在我的switch語句中:n.push(),我假設所有的n.X語句。上面,Stack n = new Stack()然後n.push()我試圖聲明一個新的棧n,它從掃描器方法獲取輸入名稱並將其推入堆棧。不知道爲什麼它找不到構造函數Stack()。在Stack.java中,我得到了Stack構造函數嗎?我想構建一個限制爲SIZE = 5個元素的字符串堆棧。 – ksdst1