簡體   English   中英

用遞歸找到堆棧中的最小值

[英]Find the minimal value in stack with recursion

我需要在堆棧中遞歸地找到最小值,然后返回最小值......我嘗試迭代解決它並且它起作用了。

我的遞歸嘗試:

import java.util.Scanner;

public class Main {

    public static int minimalValue(Stack<Integer> s, int min) {
        if (s.isEmpty())
            return min;
        // Save the previous value.
        int prev = s.pop();

        if (!s.isEmpty() && prev < min)
            min = prev;
        return minimalValue(s, min);
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        Stack<Integer> stack = new Stack<Integer>();
        stack.push(99);
        stack.push(64);
        stack.push(73);
        stack.push(54);
        stack.push(100);
        stack.push(82);
        stack.push(55);
        stack.push(300);
        System.out.println(minimalValue(stack, stack.top()));

        in.close();
    }
}

如您所見,在方法完成后,堆棧中的每個元素都被刪除了。 你能給我一個更好的解決方案嗎?

您可以按如下方式保留原始Stack

 public static int minimalValue(Stack<Integer> s) {
    if (s.isEmpty())
        return Integer.MAX_VALUE;
    int last = s.pop();
    int min = Math.min(last, minimalValue(s));
    s.push(last);
    return min;
}

這種遞推通過觀察在最小值創建Stack是頂部之間的最小Stack和最小值的Stack通過去除的頂部得到的Stack

通過在每次遞歸調用后添加彈出元素,我確保Stack最終返回其原始狀態。

請注意,此解決方案不需要將第二個參數傳遞給遞歸方法。

測試:

Stack<Integer> stack = new Stack<Integer>();
stack.push(99);
stack.push(64);
stack.push(73);
stack.push(54);
stack.push(100);
stack.push(82);
stack.push(55);
stack.push(300);
System.out.println(minimalValue(stack));
System.out.println (stack);

輸出:

54
[99, 64, 73, 54, 100, 82, 55, 300]

如您所見, Stack最終包含其所有元素。

這可能被認為是作弊,但您可以通過克隆它並在克隆上操作來避免修改原始堆棧。

import java.util.Optional;
import java.util.Stack;

class Scratch {
    public static Optional<Integer> minimalValue(Stack<Integer> s, Optional<Integer> min) {
        if (s.empty()) {
            return min;
        }

        Integer topElement = s.pop();
        Integer newMin = Math.min(topElement, min.orElse(topElement));
        return minimalValue(s, Optional.of(newMin));
    }

    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(99);
        stack.push(64);
        stack.push(73);
        stack.push(54);
        stack.push(100);
        stack.push(82);
        stack.push(55);
        stack.push(300);

        Stack<Integer> clone = (Stack) stack.clone();
        Optional<Integer> result = minimalValue(clone, Optional.empty());
        System.out.println(result.orElse(null));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM