我使用链表编写了这段堆栈代码,但我遇到了以相反顺序打印字母的代码的问题,而没有创建以相反顺序显示字母的函数
class SimpleLinkedListStack2 实现 SimpleStack ,Iterable {
static class ListNode<T> {
public T value;
public ListNode<T> next;
public ListNode(T value, ListNode<T> next) {
this.value = value;
this.next = next;
}
}
private ListNode<T> head = null;
private int count = 0;
public Iterator<T> iterator() {
return new Iterator<T>() {
private ListNode<T> next = head;
@Override
public boolean hasNext() {
return next != null;
}
@Override
public T next() {
if (next == null)
throw new NoSuchElementException();
T value = next.value;
next = next.next;
return value;
}
};
}
@Override
public void push(T value) {
head = new ListNode<>(value, head);
count++;
}
@Override
public T pop() throws Exception {
if (count == 0) {
throw new Exception("Stack is empty");
}
T value = head.value;
head = head.next;
count--;
return value;
}
@Override
public T peek() throws Exception {
if (count == 0) {
throw new Exception("Stack is empty");
}
return head.value;
}
}
这是主类
public class main {
public static void main(String[] args) {
SimpleLinkedListStack2 <String>stack2= new SimpleLinkedListStack2<>();
stack2.push("a");
stack2.push("b");
stack2.push("c");
stack2.push("d");
stack2.push("e");
for (String letters : stack2){
System.out.println(letters);
}
}
}
出不过是
e d C 乙 一种 因为我需要在类 SimpleLinkedListStack2 中做一个函数来显示字母的相反顺序
答案 0 :(得分:0)
只需遍历您的代码:
<块引用>stack2.push("a");
这会将您堆栈的 head
从 null
更改为没有 next
且值为 "a"
的节点。您的堆栈现在是:-> ["a", -> null]
,其中 ->
是“指向对象”。
stack2.push("b");
现在你的堆栈是 -> ["b", -> ["a", -> null]]
:你为 "b"
创建一个新的 ListNode 对象,并将它的“next”指针更新为 head 是什么,然后 head 指向这个新创建的东西。
因此,当然,如果您随后对其进行迭代,您将首先获得最后添加的内容(此处为“b”)。
因此,您的代码 pritns e d c b a
- 这是您以相反顺序放入列表的内容,因为这就是您编程的内容,这就是堆栈的内容(它们是“后进先出”-最后一个您输入的内容是 e
,根据设计,这是第一个出现的内容!
这是一个所谓的“单向链表”,意思是,任何给定的 LinkedNode 都知道它的下一个节点,但不知道它的前一个节点。 您不能就地反向遍历单向链表 - 如果没有激烈的步骤,您想要的东西是不可能的。
例如,您可以创建一个全新的堆栈,只需遍历此堆栈,自然会导致新创建的堆栈与原始堆栈完全相反。然后打印反向堆栈,然后将其扔掉(java 被垃圾收集;那部分会自动发生)。没有“简单”的解决方案/没有不占用内存的解决方案。您也可以直接构建字符串,然后将其反转。
也许这就是这个家庭作业练习的重点,让您思考这些 LinkedNode 对象在内存中是如何相互关联的。拿出一张纸,去勾勒出来。框和箭头。你会弄明白的。