我有一个家庭作业问题,我需要从堆栈中删除所有绿色项目。
这是我的代码:
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
答案 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
被删除为void
,System.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)
我可以看到你应该解决的这些问题,以纠正你的程序:
public void addPez(Stack stack1)
应为static
public static void addPez(Stack stack1)
System.out.println(printStack(stack2));
- 在stack2
方法的范围内定义了main
个变量。
在方法removeGreen(Stack stack1)
中,您尚未将pop
的结果投放到String
String tmp = (String)stack1.pop();
在方法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();