首页 > 解决方案 > 以堆栈的相反顺序显示字母

问题描述

我使用链表编写了此堆栈代码,但我遇到了代码问题,它以相反的顺序打印字母,而没有创建以相反顺序显示字母的函数

类 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 类中以相反的顺序显示字母

标签: javalinked-liststack

解决方案


只需浏览您的代码:

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 对象在内存中是如何相互关联的。拿出一张纸,画出来。盒子和箭头。你会想办法的。


推荐阅读