2012-11-15 72 views
0

我有一個家庭作業問題,我需要從堆棧中刪除所有綠色項目。如何從堆棧中刪除某些項目

這裏是我的代碼:

import java.util.*; 
import java.io.*; 

public class Pex 
{ 
public static void main(String[] args) 
{ 
Stack stack1 = new Stack(); 

addPez(stack1); 
removeGreen(stack1); 
System.out.println(printStack(stack2)); 
} 

public void addPez(Stack stack1) 
{ 
    stack1.push("yellow"); 
    stack1.push("red"); 
    stack1.push("green"); 
    stack1.push("green"); 
    stack1.push("yellow"); 
    stack1.push("yellow"); 
    stack1.push("red"); 
    stack1.push("green"); 
} 

public static void removeGreen(Stack stack1) 
{ 
Stack temp = new Stack(); 
while (!stack1.isEmpty()){ 
    String check = (String)(stack1.pop()); 
    if(check.equals("green")){ 
    stack1.pop();} 
    else{ 
    temp.push(check);} 
} 
Stack stack2 = new Stack(); 
while (!temp.isEmpty()){ 
    String tmp = stack1.pop(); 
    stack2.push(tmp);} 
} 

public static void printStack(Stack stack2) 
{ 
Stack xerox = stack2.clone(); 
while (!xerox.isEmpty()){ 
    System.out.println(xerox.pop());} 
} 
} 

有人能指出我在正確的方向?我想我快到了。

我還需要弄清楚爲什麼我得到一些錯誤。

下面是錯誤:

Pex.java:10: non-static method addPez(Stack) cannot be referenced from a static context 
addPez(stack1); 
^ 
Pex.java:12: cannot find symbol 
symbol : variable stack2 
location: class Pex 
System.out.println(printStack(stack2)); 
          ^

Pex.java:39: incompatible types 
found : java.lang.Object 
required: java.lang.String 
    String tmp = stack1.pop(); 
         ^

Pex.java:45: incompatible types 
found : java.lang.Object 
required: Stack 
Stack xerox = stack2.clone(); 
         ^

./Stack.java:69: cannot find symbol 
symbol : variable stack1 
location: class Stack 
    stack2 = (Stack)(stack1.clone()); 
        ^

5 errors 
+0

製作'addPez'爲'static'你不能從靜態上下文 –

回答

2

公共靜態無效的主要(字串[] args){ 堆棧棧1 =新堆棧()好得多;

addPez(stack1); 
    removeGreen(stack1); 
    printStack(stack1); //stack2 is not defined and remove println statement 
} 

public static void addPez(Stack stack1) {//make addPez as static 
    stack1.push("yellow"); 
    stack1.push("red"); 
    stack1.push("green"); 
    stack1.push("green"); 
    stack1.push("yellow"); 
    stack1.push("yellow"); 
    stack1.push("red"); 
    stack1.push("green"); 
} 

public static void removeGreen(Stack stack1) { 
    Stack temp = new Stack(); 
    while (!stack1.isEmpty()) { 
     String check = (String) (stack1.pop()); 
     if (check.equals("green")) { 
      //stack1.pop(); 
     } else { 
      temp.push(check); 
     } 
    } 
    //Stack stack2 = new Stack(); 
    while (!temp.isEmpty()) { 
     String tmp = (String)temp.pop(); 
     stack1.push(tmp); 
    } 
} 

public static void printStack(Stack stack1) { 
    Stack xerox = (Stack)stack1.clone(); 
    while (!xerox.isEmpty()) { 
     System.out.println(xerox.pop()); 
    } 
} 
+0

訪問非靜態methid我已經改變了代碼,現在你可以運行它 – anandkesari01

+0

問題是我需要打印出堆棧無果嶺。這隻會打印綠色,這就是爲什麼我有stack2。我需要stack2打印出非綠色堆棧嗎? – TheNameHobbs

2

1)要調用靜態one.Change addPez(非靜態方法addPez(...)),以靜態或調用它在任何非靜態方法
2)System.out.println(printStack(stack2));什麼是stack2?我沒有發現它在你的代碼
3)stack1.pop(); pop()方法返回的類型是你應該做Object.So這樣
String tmp = (String)stack1.pop();
這是對象的類型轉換爲String(在你的情況下,它是確定的,但不推薦)
4)& 5) xerox =(Stack)stack2.clone();你需要做這樣的

0

public void addPez(Stack stack1)應該public static void addPez(Stack stack1)

沒有變動的叫你主要方法stack2,你的意思stack1

System.out.println(printStack(stack2));應該是System.out.println(printStack(stack1));

這實際上會導致另一個錯誤,因爲printStack被刪除,因爲返回void,其中System.out.println()將不會喜歡。取而代之的是,只需調用打印方法printStack(stack1);直接,因爲它是爲之傾倒的結果輸出到屏幕的任何方式......

你應該是您鑄造棧的返回類型,String tmp = stack1.pop();String tmp = (String)stack1.pop();

Stack xerox = stack2.clone();是一樣的問題作爲最後一個在本質上應該是Stack xerox = (Stack)stack2.clone();

理念 ...

否則盲目的鑄件通常是一個壞主意((String)stack1.pop())。現在在你的簡單程序中,這可能不是什麼大不了的事情,但鼓勵了不好的做法。

你應該,你應該使用public static void addPez(Stack<String> stack1)

而不是public static void removeGreen(Stack stack1)你應該使用public static void removeGreen(Stack<String> stack1)服用的Java's Generics支持

這樣的優勢,而不是Stack stack1 = new Stack();,你應該使用Stack<String> stack1 = new Stack<String>();

而不是public static void addPez(Stack stack1)

而不是Stack temp = new Stack();和你應該用Stack temp = new Stack<String>();Stack stack2 = new Stack<String>();

而不是,你應該使用public static void printStack(Stack<String> stack2)

這意味着你不再需要在成爲String check = stack1.pop();

這基本上意味着remove方法(String check = (String) (stack1.pop()))的情況下您的Stack只能包含String個對象,並刪除任何有人向您傳遞錯誤類型的堆棧的可能性。

0

如果元素爲「綠色」,則不應再彈出。

while (!stack1.isEmpty()){ 
    String check = (String)(stack1.pop()); 
    if(!check.equals("green")) { 
     temp.push(check); 
    } 
} 
1
Pex.java:10: non-static method addPez(Stack) cannot be referenced 
from a static context addPez(stack1); 

好像你正在使用這個錯誤,需要構造一個對象使用addPez,或添加static的方法頭在objectName.methodName();方式不使用它。

編輯:哇,stackOverflow很快。我必須在比賽中取得勝利。我認爲其他人提供了你的答案。乾杯!

0

我能看到這些問題,您應該決心改正你的程序:

  1. public void addPez(Stack stack1)應該static

    public static void addPez(Stack stack1) 
    
  2. System.out.println(printStack(stack2)); - 在main方法的範圍中沒有定義stack2變量。

  3. 在方法removeGreen(Stack stack1)你還沒有鑄造的pop的結果String

    String tmp = (String)stack1.pop(); 
    
  4. 在方法printStack(Stack stack2)你還沒有鑄造的clone的結果Stack

    Stack xerox = (Stack)stack2.clone(); 
    

這些修正將使程序可編譯,但您可以通過一些可以改善時間和空間性能以及邏輯的更多改變來使程序更好。

removeGreen方法更改爲以下幾點:

public static Stack removeGreen(Stack stack1) 
{ 
    Stack temp = new Stack(); 
    while (!stack1.isEmpty()) 
    { 
     String check = (String)(stack1.pop()); 
     if(! check.equals("green")) 
     { 
      temp.push(check); 
     } 
    } 

    return temp; 
} 

main方法改變這一行removeGreen(stack1);到以下幾點:

stack1 = removeGreen(stack1); 

和,一個更

使用Generics。即

Stack<String> aStack = new Stack<String>(); 

Stack aStack = new Stack(); 
相關問題