1

スタックからすべての緑色のアイテムを削除する必要があるという宿題の問題があります。

これが私のコードです:

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
4

6 に答える 6

3

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

    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());
    }
}
于 2012-11-15T05:31:51.073 に答える
2

1)非静的メソッド addPez(...) を静的メソッドで呼び出しています。addPez() を静的メソッドに変更するか、任意の非静的メソッドで呼び出します
2) System.out.println(printStack(stack2)); stack2 とは? 私はあなたのコードでそれを見つけられませんでした
3) popstack1.pop(); () メソッドの戻り値の型は Object です。したがって、次のようにする必要があり
String tmp = (String)stack1.pop();
ます。
5) xerox = (スタック)stack2.clone(); あなたはそのようにする必要があります

于 2012-11-15T05:21:50.110 に答える
1
Pex.java:10: non-static method addPez(Stack) cannot be referenced 
from a static context addPez(stack1);

これを間違って使用しているようで、使用するオブジェクトを構築するか、メソッドヘッダーにaddPez追加して使用しないようにする必要があります。staticobjectName.methodName();

編集:うわー、stackOverflowは速いです。私はゲームに頭を入れなければなりません。私は他の人があなたの答えを提供したと思います。乾杯!

于 2012-11-15T05:24:28.153 に答える
0

プログラムを修正するために解決する必要があるこれらの問題を確認できました。

  1. public void addPez(Stack stack1)する必要がありますstatic

    public static void addPez(Stack stack1)
    
  2. System.out.println(printStack(stack2));--メソッドstack2のスコープに変数が定義されていません。main

  3. メソッドでは、結果をにremoveGreen(Stack stack1)キャストしていませんpopString

    String tmp = (String)stack1.pop();
    
  4. メソッドでは、結果をにprintStack(Stack stack2)キャストしていませんcloneStack

    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);

そして、もう1つ

Genericsを使用します。すなわち

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

よりもはるかに優れています

Stack aStack = new Stack();
于 2012-11-15T05:28:24.433 に答える
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ます。代わりに、何らかの方法で結果を画面にダンプしているため、直接print メソッドを呼び出すだけです...voidSystem.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())。単純なプログラムでは、これはおそらく大したことではありませんが、悪い習慣を助長します。

Java の Genericsサポートを利用する必要があります

したがって、代わりにStack stack1 = new Stack();使用する必要がありますStack<String> stack1 = new Stack<String>();

代わりにpublic static void addPez(Stack stack1)使用する必要がありますpublic static void addPez(Stack<String> stack1)

代わりにpublic static void removeGreen(Stack stack1)使用する必要がありますpublic static void removeGreen(Stack<String> stack1)

andの代わりにStack temp = new Stack();andStack stack2 = new Stack();を使用する必要がStack temp = new Stack<String>();ありますStack stack2 = new Stack<String>();

代わりにpublic static void printStack(Stack stack2)使用する必要がありますpublic static void printStack(Stack<String> stack2)

String check = (String) (stack1.pop())これは、remove メソッド ( ) でケースが不要になったことを意味します。String check = stack1.pop();

これは基本的に、オブジェクトStackのみを含めることができString、誰かが間違ったタイプのスタックを渡す可能性を排除することを意味します。

于 2012-11-15T05:22:57.867 に答える
0

要素が「緑」の場合は、再度ポップしないでください。

while (!stack1.isEmpty()){
    String check = (String)(stack1.pop());
    if(!check.equals("green")) {
        temp.push(check);
    }
}
于 2012-11-15T05:24:00.273 に答える