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) stack1.pop(); pop() 方法返回类型是 Object.所以你应该这样做
String tmp = (String)stack1.pop();
这是对象到 String 的类型转换(在你的情况下可以,但不推荐)
4)& 5) 施乐=(堆栈)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,或者添加static到方法头以不以这种objectName.methodName();方式使用它。

编辑:哇,stackOverflow 很快。我得在比赛中振作起来。我认为其他人提供了您的答案。干杯!

于 2012-11-15T05:24:28.153 回答
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()不会喜欢。相反,只需直接调用 print 方法printStack(stack1);,因为它会以任何方式将结果转储到屏幕上......

您应该转换堆栈的返回类型,String tmp = stack1.pop();应该是String tmp = (String)stack1.pop();

Stack xerox = stack2.clone();和上一个是同一个问题,本质上应该是Stack xerox = (Stack)stack2.clone();

想法...

盲投通常是个坏主意((String)stack1.pop())。现在在您的简单程序中,这可能没什么大不了的,但会鼓励不良做法。

您应该利用Java 的泛型支持

所以,而不是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)

而不是Stack temp = new Stack();andStack stack2 = new Stack();你应该使用Stack temp = new Stack<String>();andStack stack2 = new Stack<String>();

而不是public static void printStack(Stack stack2)你应该使用public static void printStack(Stack<String> stack2)

这意味着您不再需要 remove 方法 ( String check = (String) (stack1.pop())) 中的 case,它变成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 回答
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)中,您没有将结果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);

而且,还有一个

使用泛型。IE

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

Stack aStack = new Stack();
于 2012-11-15T05:28:24.433 回答