【问题标题】:Reversing a Stack without using Java API在不使用 Java API 的情况下反转堆栈
【发布时间】:2021-09-03 09:21:36
【问题描述】:

我想实现一个反转堆栈的反转方法。我认为解决方案是递归。我尽力了,但它不起作用。谁能告诉我我的错误在哪里?

public class Stack<E> {

    private final E value;
    private final Stack<E> next;

    private Stack(E value, Stack<E> next) {
        this.value = value;
        this.next = next;
    }

    public static <E> Stack<E> create() {
        return null;
    }
    public static <E> Stack<E> push(Stack<E> a, E e) {
        Stack<E> erg = new Stack<E>(e,a);
        return erg;
    }

    public static <E> Stack<E> pop(Stack<E> a) { //pop(push(s,e) = s
        if (a == null) {
            return Stack.<E>create();
        }
        else if (a.value == null){
            return Stack.<E>create();
        }
        else {
            return a.next;
        }
    }
    public static <E> E top(Stack<E> a) {
        if (a == null) {
            return null;
        }
        else if (a.value == null){
            return null;
        }
        else {
            return a.value;
        }
    }
    public static <E> boolean isEmpty(Stack<E> a) {
        if (a == null) {
            return true;
        }
        else if (a.value == null) {
            return true;
        }
        else {
            return false;
        }
    }
    public static <E> Stack<E> reverse(Stack<E> s) {
        Stack<E> top = Stack.<E>pop(s);
        if (Stack.<E>isEmpty(s)) {
            return top;
        } else {
            Stack<E> bottom = reverse(s);
            Stack.<E>push(top, null);
            return bottom;
        }
    }
}

我不允许使用 Java API 的类;我不允许添加更多的类或方法或属性。

【问题讨论】:

    标签: java generics recursion linked-list stack


    【解决方案1】:

    我会这样做。我正在使用作为 API 一部分的堆栈,但只要堆栈具有推送和弹出功能,任何实现都应该有效。

    • 以反向方法创建一个新堆栈。
    • 当您从原始堆栈中弹出一个值时,将其压入新堆栈。
    • 返回新堆栈
    Stack<Integer> stack = new Stack<>();
    for (int i = 1; i < 6; i++) {
        stack.push(i);
    }
    
    System.out.println(stack);
    stack = reverse(stack);
    System.out.println(stack);
        
        
    public static <T> Stack<T> reverse(Stack<T> stack) {
        Stack<T> reversed = new Stack<>();
        while (!stack.isEmpty()) {
            reversed.push(stack.pop());
        }
        return reversed;
    }
    

    打印

    [1, 2, 3, 4, 5]
    [5, 4, 3, 2, 1]
    

    【讨论】:

    • pop 中出现了另一个错误。当我运行这个: Stack.push(null, "JohnDoe") 它返回 null,但它不应该。我该如何解决这个问题?
    • 为什么要传递堆栈来推送或弹出?无论您使用的是链表还是数组或列表,除了您尝试推送或弹出的参数之外,您不应该传递任何其他内容。
    • 暂时忘记倒车,你的堆栈是否按预期工作并满足训练练习源的要求?
    【解决方案2】:

    使用另一个堆栈来反转堆栈。

    public static <E> Stack<E> reverse(Stack<E> s) {
        Stack<E> reversedStack = new Stack<E>(null, null);
        while(!Stack.<E>isEmpty(s) {
            Stack.<E>push(reversedStack, s.value);
            s = Stack.<E>pop(s));
        }
        return reversedStack;
    }
    

    【讨论】:

    • 我得到这个:TestTimedOutException:测试在 555 毫秒后超时
    • 是的,但我是这样实现的。 public static &lt;E&gt; Stack&lt;E&gt; reverse(Stack&lt;E&gt; s) { Stack&lt;E&gt; reversedStack = new Stack&lt;E&gt;(null, null); while(!Stack.&lt;E&gt;isEmpty(s)) { reversedStack.&lt;E&gt;push(Stack.&lt;E&gt;pop(s), null); } return reversedStack; }
    • 这次你用了什么?
    • 您的代码。 public static &lt;E&gt; Stack&lt;E&gt; reverse(Stack&lt;E&gt; s) { Stack&lt;E&gt; reversedStack = new Stack&lt;E&gt;(null, null); while(!Stack.&lt;E&gt;isEmpty(s)) { Stack.&lt;E&gt;push(reversedStack, s.value); s = Stack.&lt;E&gt;pop(s); } return reversedStack; }
    • 我现在不抛出异常。但我得到空
    猜你喜欢
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 2018-03-29
    • 2012-04-23
    • 1970-01-01
    相关资源
    最近更新 更多