如何从堆栈中删除某些项目

时间:2012-11-15 05:16:03

标签: java linked-list stack

我有一个家庭作业问题,我需要从堆栈中删除所有绿色项目。

这是我的代码:

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

6 个答案:

答案 0 :(得分:2)

1)您在静态方法中调用非静态方法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();你需要这样做

答案 1 :(得分:2)

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

答案 2 :(得分:1)

Pex.java:10: non-static method addPez(Stack) cannot be referenced 
from a static context addPez(stack1);

您似乎错误地使用了这个,并且需要构建一个对象以使用addPez,或者将static添加到方法标头中,而不是以objectName.methodName();方式使用它。

编辑:哇,stackOverflow很快。我得在游戏中占据优势。我认为其他人提供了你的答案。干杯!

答案 3 :(得分:0)

public void addPez(Stack stack1)应为public static void addPez(Stack stack1)

你的main方法中没有名为stack2的变量,你的意思是stack1 ??

System.out.println(printStack(stack2));应为System.out.println(printStack(stack1));

这实际上会导致另一个错误,因为printStack被删除为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's 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)

而不是Stack temp = new Stack();Stack 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()))中的大小写成为String check = stack1.pop();

这基本上意味着你的Stack只能包含String个对象,并且删除了某人传递错误类型的堆栈的可能性。

答案 4 :(得分:0)

如果元素为“绿色”,则不应再次弹出。

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

答案 5 :(得分: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();
    

  5. 这些校正将使程序可编辑,但您可以通过一些更改来改善时间和空间性能以及它的逻辑,从而使您的程序更好。

    将您的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();