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打印非绿色堆栈吗?