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

Java 如何从堆栈中删除某些项,java,linked-list,stack,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

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

这是我的密码:

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
1您正在调用非静态方法addPez。。。将addPez更改为static或在任何非静态方法中调用它 2 System.out.printlnprintStackstack2;stack2是什么?我在你的密码里没找到 3.1.pop;pop方法返回的类型是Object,所以您应该像下面这个字符串tmp=Stringstack1.pop;这是对象到字符串的类型转换在您的情况下可以,但不建议这样做 4 & 5 xerox=stack2.clone;您需要这样做

1您正在调用非静态方法addPez。。。将addPez更改为static或在任何非静态方法中调用它 2 System.out.printlnprintStackstack2;stack2是什么?我在你的密码里没找到 3.1.pop;pop方法返回的类型是Object,所以您应该像下面这个字符串tmp=Stringstack1.pop;这是对象到字符串的类型转换在您的情况下可以,但不建议这样做 4 & 5 xerox=stack2.clone;您需要这样做

public void addPezStack 1应该是public static void addPezStack 1

主方法中没有名为stack2的变量,您是指stack1吗

System.out.printlnprintStackstack2;应为System.out.printlnprintStackstack1

这实际上会导致另一个错误,因为printStack被清除为返回void,这是System.out.println不喜欢的。相反,只需调用print方法printStackstack1;直接,当它将结果转储到屏幕上时

您应该强制转换堆栈的返回类型,字符串tmp=stack1.pop;应为字符串tmp=Stringstack1.pop

Stack xerox=stack2.clone;与上一个问题相同,本质上应该是Stack xerox=Stackstack2.clone

想法

在Stringstack1.pop中进行盲播通常是个坏主意。现在在您的简单程序中,这可能不是什么大问题,但会鼓励不良做法

你应该利用支持

因此,代替Stack stack1=新堆栈;您应该使用Stack stack1=新堆栈

    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());
    }
}
您应该使用publicstaticvoidaddpezstack堆栈1而不是publicstaticvoidaddpezstack堆栈1

您应该使用公共静态void removeGreenStack stack1,而不是公共静态void removeGreenStack stack1

而不是堆栈温度=新堆栈;和Stack stack2=新堆栈;您应该使用Stack temp=新堆栈;和Stack stack2=新堆栈

    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());
    }
}
您应该使用publicstaticvoidprintstackstack2而不是publicstaticvoidprintstack2

这意味着您不再需要remove方法String check=String stack1.pop中的大小写,它将变成String check=stack1.pop

这基本上意味着您的堆栈只能包含字符串对象,并消除了有人向您传递错误类型堆栈的可能性。

public void addPezStack stack1应该是public static void addPezStack stack1

主方法中没有名为stack2的变量,您是指stack1吗

System.out.printlnprintStackstack2;应为System.out.printlnprintStackstack1

这实际上会导致另一个错误,因为printStack被清除为返回void,这是System.out.println不喜欢的。相反,只需调用print方法printStackstack1;直接,当它将结果转储到屏幕上时

您应该强制转换堆栈的返回类型,字符串tmp=stack1.pop;应为字符串tmp=Stringstack1.pop

Stack xerox=stack2.clone;与上一个问题相同,本质上应该是Stack xerox=Stackstack2.clone

想法

在Stringstack1.pop中进行盲播通常是个坏主意。现在在您的简单程序中,这可能不是什么大问题,但会鼓励不良做法

你应该利用支持

因此,代替Stack stack1=新堆栈;您应该使用Stack stack1=新堆栈

    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());
    }
}
您应该使用publicstaticvoidaddpezstack堆栈1而不是publicstaticvoidaddpezstack堆栈1

您应该使用公共静态void removeGreenStack stack1,而不是公共静态void removeGreenStack stack1

而不是堆栈温度=新堆栈;和Stack stack2=新堆栈;您应该使用Stack temp=新堆栈;和Stack stack2=新堆栈

    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());
    }
}
您应该使用publicstaticvoidprintstackstack2而不是publicstaticvoidprintstack2

这意味着您不再需要remove方法String check=String stack1.pop中的大小写,它将变成String check=stack1.pop

这基本上意味着您的堆栈只能包含字符串对象,并且消除了有人向您传递wro的任何可能性
ng堆栈类型。

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

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

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

while (!stack1.isEmpty()){
    String check = (String)(stack1.pop());
    if(!check.equals("green")) {
        temp.push(check);
    }
}
看起来您使用的方法不正确,需要构造一个对象来使用addPez,或者将static添加到方法头中,以便不在objectName.methodName中使用它;态度

编辑:哇,stackOverflow很快。我要在比赛中发挥我的头脑。我认为其他人提供了你的答案。干杯

看起来您使用的方法不正确,需要构造一个对象来使用addPez,或者将static添加到方法头中,以便不在objectName.methodName中使用它;态度


编辑:哇,stackOverflow很快。我要在比赛中发挥我的头脑。我认为其他人提供了你的答案。干杯

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

public void addPezStack stack1应为静态

System.out.printlnprintStackstack2;-主方法范围内未定义stack2变量

在方法removeGreenStack stack1中,您尚未将pop的结果强制转换为字符串

在方法PrintStack2中,您尚未将克隆结果强制转换为堆栈

这些修正将使程序可编译,但您可以通过更多的更改使程序变得更好,这些更改将改善时间和空间性能以及逻辑

将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;
}
stack1 = removeGreen(stack1);
在主方法中,更改此行removeGreenstack1;对以下内容:

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;
}
stack1 = removeGreen(stack1);
还有一个

使用。i、 e


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

public void addPezStack stack1应为静态

System.out.printlnprintStackstack2;-主方法范围内未定义stack2变量

在方法removeGreenStack stack1中,您尚未将pop的结果强制转换为字符串

在方法PrintStack2中,您尚未将克隆结果强制转换为堆栈

这些修正将使程序可编译,但您可以通过更多的更改使程序变得更好,这些更改将改善时间和空间性能以及逻辑

将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;
}
stack1 = removeGreen(stack1);
在主方法中,更改此行removeGreenstack1;对以下内容:

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;
}
stack1 = removeGreen(stack1);
还有一个

使用。i、 e


公共静态无效字符串[]args{ Stack stack1=新堆栈

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

公共静态无效字符串[]args{ Stack stack1=新堆栈

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

使addPez为静态您无法从静态上下文访问非静态methid使addPez为静态您无法从静态上下文访问非静态methid我已更改了代码,现在您可以运行它问题是我需要打印没有绿色的堆栈。这只打印绿色的堆栈,这就是我使用stack2的原因。我需要stac吗k2打印非绿色堆栈?我已经更改了代码,现在您可以运行它。问题是我需要打印没有绿色堆栈的堆栈。这只打印绿色堆栈,这就是为什么我有stack2。我需要stack2打印非绿色堆栈吗?