我理解堆栈是如何工作的,但我必须为push,pop和peek编写方法,然后在驱动程序类中实现它们。这是令人困惑的地方。这是我的Stack
课程:
public class Stack implements StackInterface
{
private final int ARRAY_SIZE = 9;
private String[] movies = new String[ARRAY_SIZE]; // Hold movie titles
private int top = 0;
/**
* Constructor
* @param moviesIn
*/
public Stack(String[] moviesIn)
{
movies = moviesIn;
}
/**
* Test for full stack
*/
public void push(String moviesIn)
{
if (top >= movies.length)
System.out.println("ERROR: Stack is full");
top++;
movies[top] = moviesIn;
}
/**
* Test for empty stack
*/
public String pop()
{
if (top == 0) {
System.out.println("ERROR: Stack is empty");
return " ";
}
top--;
return movies[top];
}
public void peek()
{
// ???
}
}
以下是我到目前为止main()
方法中的内容:
public static void main(String[] args)
{
String[] movies = {"Amour", "*Argo", "Beasts of the Southern Wild", "Django Unchained", "Les Misérables", "Life of Pi", "Lincoln", "Silver Linings Playbook", "Zero Dark Thirty"};
Stack oscarStack = new Stack(movies);
oscarStack.push(movies);
}
我以为我可以将一个对象传递给堆栈,但它似乎不会那样工作。那么如何将oscarStack
对象推入堆栈?或者我必须单独推每个字符串?在继续我的在线研究中,似乎堆栈构造函数只能创建一个空堆栈。这就是我无法传递对象参数的原因吗?
答案 0 :(得分:2)
您必须将数组的每个元素都压入堆栈:
for (String movie : movies) {
oscarStack.push(movie);
}
或者,您可以在Stack
类中编写一个“pushAll”方法,该方法接受一个字符串数组并基本上做同样的事情。
但是,您似乎已经在构造函数中设置了电影数组,因此我没有看到调用push
的目的。也许你可以进一步解释。
P.S。您的推送方法似乎有一个错误:
public void push(String moviesIn)
{
if (top >= movies.length)
System.out.println("ERROR: Stack is full");
top++;
movies[top] = moviesIn;
}
使用此代码,无法为movies[0]
分配值。
答案 1 :(得分:2)
在main中,您将隐式地将所有元素放入支持数组中,而不进行任何推送操作。您可能想要做的是迭代想要推送的电影,然后将它们推入。
应该进行两项更改:
push
有两个错误:
movies[top++]
。ArrayIndexOutOfBoundsException
。
public static void main(String[] args) {
String[] movies = {"Amour", "*Argo", "Beasts of the Southern Wild", "Django Unchained", "Les Misérables", "Life of Pi", "Lincoln", "Silver Linings Playbook", "Zero Dark Thirty"};
Stack oscarStack = new Stack();
for(String movie : movies) {
oscarStack.push(movie);
}
}
答案 2 :(得分:0)
push方法需要一个字符串作为参数而不是一个字符串数组,因此您可以将push方法更改为接受字符串数组作为参数,或者一次将一个字符串传递给当前的push方法。 另外,你不是推动oscarStack对象,如果你想再次推送任何对象,方法签名应该支持它。
答案 3 :(得分:0)
除了这里给出的答案外,还要记住将从堆栈中弹出的引用置空。 以下是“Effective Java”一书的引用
一般来说,每当一个类管理自己的内存时, 程序员应警惕内存泄漏。每当一个元素是 释放后,元素中包含的任何对象引用都应该为空 进行。
从书中复制的样本:
public Object pop() {
if (size==0) throw new EmptyStackException();
Object result = elements[--size];
elements[size] = null; // Eliminate obsolete reference
return result;
}
答案 4 :(得分:0)
如果您想使用Stack
数据结构而又不想承担Synchronization
的费用,那么您可以使用Dequeue
。 Java中提供的Stack
类扩展了Vector
。
Deque<Integer> q=new LinkedList<Integer>();
q.offerFirst(Integer.SIZE);
q.offerFirst(Integer.SIZE);
q.pollFirst();
这是Java集合框架中最有效的堆栈实现。
答案 5 :(得分:0)
您可能应该将变量初始化为top = -1。请注意,我没有为此类Stack初始化构造函数,因为它不是强制性的。如果没有为类提供用户定义的构造函数,则编译器会初始化成员变量恢复为默认值。
1。数字数据类型设置为0。 2.char数据类型设置为空字符('\ 0')。 3.参考变量设置为空。 这是完整代码的实现方式:-
public static void main(String[] args)
{
String[] movies = {"Amour", "*Argo", "Beasts of the Southern Wild", "Django Unchained", "Les Misérables", "Life of Pi", "Lincoln", "Silver Linings Playbook", "Zero Dark Thirty"};
Stack oscarStack = new Stack();
for (String movie:movies){
oscarStack.push(movie);
}
}
public class Stack implements StackInterface
{
private final int ARRAY_SIZE = MAX_SIZE;
private String[] movies = new String[ARRAY_SIZE]; // Hold movie titles
private int top = -1;
/**
* Test for full stack
*/
public void push(String moviesIn)
{
if (top >= movies.length)
System.out.println("ERROR: Stack is full");
return;
top++;
movies[top] = moviesIn;
}
/**
* Test for empty stack
*/
public String pop()
{
if (top == -1) {
System.out.println("ERROR: Stack is empty");
return " ";
}
top--;
return movies[top];
}
public void peek()
{
if(top==-1){
System.out.println("ERROR: Stack is empty");
return " ";
}
else{
return(movies[top]);
} }}