【问题标题】:Return the higher element than the top of the Stack in Java在Java中返回比堆栈顶部更高的元素
【发布时间】:2013-06-22 11:11:22
【问题描述】:

nbGreaterThanFirst 方法返回 myStack 中大于或等于 myStack 顶部元素的元素数。假设堆栈的顶部是 5,并且有 7、3 和 9 的元素。它应该返回 9,因为它大于堆栈中的其余元素。算法的步骤对我来说似乎没问题,但它不起作用。有什么建议吗?

import java.util.Stack;

public class greaterStack {
    public static int nbGreaterThanFirst(Stack<Integer> myStack) {
        int firstStack = myStack.peek(); // firstStack = 5
        for(int i=0; i<myStack.size(); i++) {
            if(myStack.peek() >= firstStack) { // if any element is greater than 5
                firstStack = myStack.peek();
                myStack.pop();
            }
        }
        return firstStack;
    }

    public static void main(String[] args) {
        Stack<Integer> s = new Stack<Integer>();
        s.push(1);
        s.push(3);
        s.push(7);
        s.push(5);

        System.out.println(nbGreaterThanFirst(s));
    }
}

【问题讨论】:

    标签: numbers integer stack


    【解决方案1】:

    在循环中,只有当栈顶 >= 您当前的 firstStack 变量时,您才会弹出元素。因此,一旦您获得一个值低于当前 firstStack 值的元素,您的算法就不允许弹出该元素并且您停止在堆栈中移动。

    对于元素为 5、7、3、9 的堆栈,一旦您点击“3”,它将使您的 if 条件失败,并且不会从堆栈中弹出更多元素。因此,您永远不会到达“9”元素。

    我的建议是将 pop() 移出 if 条件。每次迭代都弹出一次,以便检查所有元素。

    int stackSize = myStack.size();
    for(int i=0; i<stackSize; i++) {
            if(myStack.peek() >= firstStack) { // if any element is greater than 5
                firstStack = myStack.peek();
            }
            myStack.pop();
    }
    

    【讨论】:

    • 我之前已经实现了,但它仍然不起作用。输出为 7,这是不正确的,因为有一个元素是 9,因此应该显示该元素。
    • 我已经更新了我的答案。由于每次弹出时堆栈的大小都会发生变化,因此 for 循环中的 mystack.size() 会不断变化,这会导致问题。这导致循环在第三次迭代中退出比较(我一直在增加并且 stack.size() 一直在减少,所以循环只运行了一半时间)。使用局部变量存储进入循环前的栈大小,在循环中使用比较
    • 没问题。只需运行一步调试,您就可以清楚地看到您的算法何时中断。
    猜你喜欢
    • 1970-01-01
    • 2020-06-06
    • 2022-11-02
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多