【问题标题】:How to remove certain items from a Stack [closed]如何从堆栈中删除某些项目[关闭]
【发布时间】:2012-11-03 17:18:38
【问题描述】:

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

这是我的代码:

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

【问题讨论】:

  • addPez 设为static,您无法从静态上下文访问非静态方法

标签: java linked-list stack


【解决方案1】:
Pex.java:10: non-static method addPez(Stack) cannot be referenced 
from a static context addPez(stack1);

您似乎使用不正确,需要构造一个对象以使用addPez,或者将static 添加到方法头中以不以objectName.methodName(); 方式使用它。

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

【讨论】:

    【解决方案2】:

    我可以看到您应该解决这些问题以更正您的程序:

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

    【讨论】:

      【解决方案3】:

      1) 您正在静态方法中调用非静态方法 addPez(...)。将 addPez() 更改为静态或在任何非静态方法中调用它
      2 ) System.out.println(printStack(stack2));什么是stack2?我没有在你的代码中找到它
      3) stack1.pop();pop() 方法返回类型是 Object。所以你应该这样做
      String tmp = (String)stack1.pop();
      这是将对象类型转换为字符串(在您的情况下可以,但不推荐)
      4) & 5) 施乐=(堆栈)stack2.clone();你需要这样做

      【讨论】:

        【解决方案4】:

        public void addPez(Stack stack1) 应该是public static void addPez(Stack stack1)

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

        System.out.println(printStack(stack2)); 应该是System.out.println(printStack(stack1));

        这实际上会导致另一个错误,因为printStack 被清除为返回voidSystem.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's Generics 支持

        因此,您应该使用 Stack&lt;String&gt; stack1 = new Stack&lt;String&gt;(); 而不是 Stack stack1 = new Stack();

        您应该使用 public static void addPez(Stack&lt;String&gt; stack1) 而不是 public static void addPez(Stack stack1)

        你应该使用public static void removeGreen(Stack&lt;String&gt; stack1)而不是public static void removeGreen(Stack stack1)

        您应该使用 Stack temp = new Stack&lt;String&gt;();Stack stack2 = new Stack&lt;String&gt;(); 而不是 Stack temp = new Stack();Stack stack2 = new Stack();

        你应该使用public static void printStack(Stack&lt;String&gt; stack2)而不是public static void printStack(Stack stack2)

        这意味着您不再需要删除方法中的大小写 (String check = (String) (stack1.pop())),它变成了 String check = stack1.pop();

        这基本上意味着您的 Stack 只能包含 String 对象,并消除了有人将错误类型的堆栈传递给您的任何可能性。

        【讨论】:

          【解决方案5】:

          public static void main(String[] args) { 栈 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());
              }
          }
          

          【讨论】:

          • 我修改了代码,现在可以运行了
          • 问题是我需要打印没有果岭的堆栈。这只会打印出果岭,这就是我有 stack2 的原因。我需要 stack2 来打印非绿色堆栈吗?
          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 2019-08-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-12-15
            相关资源
            最近更新 更多