java - 以堆栈的相反顺序显示字母
问题描述
我使用链表编写了此堆栈代码,但我遇到了代码问题,它以相反的顺序打印字母,而没有创建以相反顺序显示字母的函数
类 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 b a 因为我需要创建一个函数来在 SimpleLinkedListStack2 类中以相反的顺序显示字母
解决方案
只需浏览您的代码:
stack2.push("a");
这会将您的堆栈head
从更改null
为没有next
且值为的节点"a"
。您的堆栈现在是:-> ["a", -> null]
,->
“指向对象”在哪里。
stack2.push("b");
现在你的堆栈是-> ["b", -> ["a", -> null]]
:你创建一个新的 ListNode 对象"b"
,并将它的“下一个”指针更新为 head ,然后 head 指向这个新创建的东西。
因此,当然,如果您随后遍历它,您首先会得到您添加的最后一个内容(此处为“b”)。
因此,您的代码 pritns e d c b a
- 这是您放入列表中的内容,以相反的顺序,因为那是您编程的内容,这就是堆栈的内容(它们是“后进先出”-您放入的最后一件事是e
, 和根据设计,这是第一个出现的东西!
但我想按照放入物品的顺序打印!
这就是所谓的“单链表”,意思是任何给定的 LinkedNode 都知道它的下一个节点,但不知道它的前一个节点。你不能就地反向遍历单链表——如果没有激烈的步骤,你想要的东西是不可能的。
例如,您可以通过迭代此堆栈来创建一个全新的堆栈,这自然会导致新创建的堆栈与原始堆栈完全相反。然后打印那个反向堆栈,然后把它扔掉(java被垃圾收集;那部分是自动发生的)。没有“简单”的解决方案/没有不需要记忆的解决方案。您也可以只构建字符串,然后将其反转。
也许这就是这个家庭作业的重点,让你思考这些 LinkedNode 对象在内存中是如何相互关联的。拿出一张纸,画出来。盒子和箭头。你会想办法的。
推荐阅读
- html - 如果以及为什么应该将 CSS 放在反应功能组件之外(靠近导入)?
- paperjs - 如何使用画布大小更改调整 PaperJs 绘图的大小和重新定位?
- javascript - 删除任何消息上的特定反应表情 (Discord.js)
- python - 无法将 RGB 图像转换为灰度
- java - Hibernate (JPA) 是否允许映射自定义列(即别名列)
- awk - 将单引号后的一行拆分为换行符
- sql - 使用 Windows 分析函数的 Oracle 累积计算
- java - Spring Cloud Stream(Kafka Streams binder)应用程序不能支持多个处理器
- amazon-web-services - AWS CLI:找不到配置文件
- terraform - Terraform - 不显示哪个资源产生错误