最近,当我来解决问题时,我正在学习 Algorithms 4th
为 Stack.java 的链接列表实现创建一个新的构造函数,以便Stack t = new Stack(s)使得引用一个新的独立的堆栈副本。
这是 Stack.java
import java.util.Iterator;
import java.util.NoSuchElementException;
public class Stack<Item> implements Iterable<Item> {
private Node<Item> first; // top of stack
private int n; // size of the stack
private static class Node<Item> {
private Item item;
private Node<Item> next;
}
/**
* Initializes an empty stack.
*/
public Stack() {
first = null;
n = 0;
}
public boolean isEmpty() {
return first == null;
}
public int size() {
return n;
}
public void push(Item item) {
Node<Item> oldfirst = first;
first = new Node<Item>();
first.item = item;
first.next = oldfirst;
n++;
}
public Item pop() {
if (isEmpty()) throw new NoSuchElementException("Stack underflow");
Item item = first.item; // save item to return
first = first.next; // delete first node
n--;
return item; // return the saved item
}
private class ListIterator<Item> implements Iterator<Item> {
private Node<Item> current;
public ListIterator(Node<Item> first) {
current = first;
}
public boolean hasNext() {
return current != null;
}
public void remove() {
throw new UnsupportedOperationException();
}
public Item next() {
if (!hasNext()) throw new NoSuchElementException();
Item item = current.item;
current = current.next;
return item;
}
}
递归解决方案的答案是为从给定节点开始的链表创建一个复制构造函数,并使用它来创建新堆栈。
Node(Node x) {
item = x.item;
if (x.next != null) next = new Node(x.next);
}
public Stack(Stack<Item> s) { first = new Node(s.first); }
但令我困惑的是如何将上述代码与 Stack.java 组合作为其构造函数,如何处理Node?创建一个新类Node?可能有人可以解雇我:)。
答案 0 :(得分:0)
您不需要创建新的类Node。对于旧堆栈和新堆栈,节点是相同的&#39; t&#39;。
目前,您的Stack
班级public Stack()
中有一个构造函数。您需要创建一个接受Stack的另一个,就像您在示例中所做的那样,然后调用一个方法将旧元素复制到新堆栈(递归或迭代)。这听起来像是家庭作业,所以我认为任何代码都不合适(不确定这方面的规则)。
答案 1 :(得分:0)
这是我hava解决了我的问题的代码片段
private class Node{
Item item;
Node next;
Node() { } //default constructor Node
Node(Node x){
item=x.item;
if(x.next!=null) next=new Node(x.next);
}
}
public Stack(){ //default constructor Stack
first=null;
N=0;
}
public Stack(Stack<Item> s) {first=new Node(s.first); }