有人能给我解释一下下面在Java中使用链表实现堆栈的方法吗?链接如下:http://algs4.cs.princeton.edu/13stacks/linkedstack.java.html,下面是代码:
public class LinkedStack<Item> implements Iterable<Item> {
private int N; // size of the stack
private Node first; // top of stack
// helper linked list class
private class Node {
private Item item;
private Node next;
}
/**
* Initializes an empty stack.
*/
public LinkedStack() {
first = null;
N = 0;
assert check();
}
/**
* Is this stack empty?
* @return true if this stack is empty; false otherwise
*/
public boolean isEmpty() {
return first == null;
}
/**
* Returns the number of items in the stack.
* @return the number of items in the stack
*/
public int size() {
return N;
}
/**
* Adds the item to this stack.
* @param item the item to add
*/
public void push(Item item) {
Node oldfirst = first;
first = new Node();
first.item = item;
first.next = oldfirst;
N++;
assert check();
}
/**
* Removes and returns the item most recently added to this stack.
* @return the item most recently added
* @throws java.util.NoSuchElementException if this stack is empty
*/
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--;
assert check();
return item; // return the saved item
}
/**
* Returns (but does not remove) the item most recently added to this stack.
* @return the item most recently added to this stack
* @throws java.util.NoSuchElementException if this stack is empty
*/
public Item peek() {
if (isEmpty()) throw new NoSuchElementException("Stack underflow");
return first.item;
}
/**
* Returns a string representation of this stack.
* @return the sequence of items in the stack in LIFO order, separated by spaces
*/
public String toString() {
StringBuilder s = new StringBuilder();
for (Item item : this)
s.append(item + " ");
return s.toString();
}
/**
* Returns an iterator to this stack that iterates through the items in LIFO order.
* @return an iterator to this stack that iterates through the items in LIFO order.
*/
public Iterator<Item> iterator() { return new ListIterator(); }
// an iterator, doesn't implement remove() since it's optional
private class ListIterator implements Iterator<Item> {
private Node 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;
}
}
// check internal invariants
private boolean check() {
if (N == 0) {
if (first != null) return false;
}
else if (N == 1) {
if (first == null) return false;
if (first.next != null) return false;
}
else {
if (first.next == null) return false;
}
// check internal consistency of instance variable N
int numberOfNodes = 0;
for (Node x = first; x != null; x = x.next) {
numberOfNodes++;
}
if (numberOfNodes != N) return false;
return true;
}
/**
* Unit tests the <tt>LinkedStack</tt> data type.
*/
public static void main(String[] args) {
LinkedStack<String> s = new LinkedStack<String>();
while (!StdIn.isEmpty()) {
String item = StdIn.readString();
if (!item.equals("-")) s.push(item);
else if (!s.isEmpty()) StdOut.print(s.pop() + " ");
}
StdOut.println("(" + s.size() + " left on stack)");
}
}
除了需要check()
方法之外,所有内容都很清楚。我不明白的是,为什么在每次操作(例如pop
、peek
)之后,我们都需要检查堆栈中元素的数量和变量n
(堆栈的大小)是否一致。我们不是一直保持这两个价值观一致吗?我真的不明白check()
方法有什么用?
我不知道“?”和“:”的用法。
对于下面的方法,调用神秘(45)时,输出为“1 0 1 1 0:2 5 11 22 45”,我明白为什么“1 0 1 1 0:”打印出来,但不明白冒号后“2 5 11 22 45”是怎么打印出来的,有人能给我解释一下吗?我试着写出来,但就是想不通。
我这里有一些关于Java的练习问题。我们应该在不使用编译器的情况下确定答案。 参考以下方法: 调用product(6)时的输出是什么? D)48 E)70 根据答案,正确的输出是48。我真的不明白为什么这是真的。6不符合基本情况,所以转到else语句。那么,乘积(6-2)=乘积(4),乘积(2)得到乘积(0),乘积(2)得到乘积(0),得到6*4,4*2,2*0,0*0。但那是32,不是48?是不
问题内容: 使用Java中的链表实现堆栈的最佳方法是什么? 编辑:我将最好的定义为最有效的使用干净的代码。我已经使用数组来实现堆栈,但是对链接列表不熟悉,因此想知道是否有人可以帮助我实现类似于以下内容的内容: 编辑:如果有人感兴趣,这是链表的实现。 问题答案: 假设您真的想从头开始,而不是使用现有的完美堆栈实现之一,那么我建议您: 创建一个“ MyStack ”类,该类实现所需的任何接口(也许列出
如图所示,您可以使用它来过滤delaunay三角剖分,并获得一个完美的极限。 有人能解释一下Magik算法吗?
我已经被这个问题困住很长时间了,我读了一堆线程,但没有一个描述我的问题,我尝试了一大堆不同的方法来做它,但没有一个奏效。我有一个PFFile,我从数组中提取并通过segue发送到下载详细视图。这个文件被称为“下载文件”。我正在尝试编程一个按钮,当点击启动下载。代码如下: 下面是发送下载文件的segue: 我使用PFQuery获取数组数据并将其存储到“pdfarray”中。这是一个同步下载,因为当我