只使用PUSH& amp;找到堆栈中最大的数字POP运营

时间:2011-12-29 03:45:51

标签: algorithm data-structures stack

任何人都可以帮我解决这个问题的算法(面试问题):

  

你有一个堆栈。设计算法以找到最大数量   仅使用PUSH / POP操作。

3 个答案:

答案 0 :(得分:4)

鉴于原帖中缺少约束,您可以弹出所有数据并计算运行最大值:

if empty(st) -> raise exception
m <- pop(st)
while not empty(st)
    n <- pop(st)
    if n > m
        m <- n

编辑(使用原始堆栈未更改的新限制以及第二个可用堆栈的新资源):

if empty(st) -> raise exception
m <- pop(st)
push(alt_st, m)
while not empty(st)
    n <- pop(st)
    push(alt_st, n)
    if n > m
        m <- n
while not empty(alt_st):
    n <- pop(alt_st)
    push(st, n)

答案 1 :(得分:2)

因为原始堆栈不能是只读的(Pop,访问数据的唯一方法,也修改堆栈),我们必须考虑“堆栈应该不变”限制意味着我们必须我们完成后将其恢复到原始状态。

我们可以通过在Raymond Hettinger提出的方法中使用另一个堆栈来实现它:

int get_max_from_stack(Stack stack) {
    int M = stack.pop();
    Stack aux;
    aux.push(M);
    while (!stack.empty()){
        int tmp = stack.pop();
        aux.push(tmp);
        M = max(M, tmp);
    };

    while (!aux.empty())
        stack.push(aux.pop());

    return M;
};

答案 2 :(得分:1)

有两种方法可以解决这个问题,要么你可以创建一个函数get_max来给出堆栈中的最大数量,或者你可以保留一些额外的信息,你可以使用它们给出堆栈中的最大数量在O(1)操作中但以extra space为代价。我会给你后一个解决方案。

对于堆栈的任何配置,您需要做的是使extra stack堆栈的最大元素位于顶部。

  1. 每当您将数字推送到原始堆栈时,请对max_stack执行以下操作,将当前值与max_stack顶部进行比较,然后将更大的数字推入其中。
  2. 当您弹出一个数字时,只需弹出max_stack
  3. 中最顶层的数字
  4. 当您需要查找max值时,只需从max_stack中选择堆栈顶部。
  5. 这样,您可以在O(1)时间内获得最大数量,并且推送和弹出操作也会保持O(1)。我可以给你代码,但它没有什么,因为它是直截了当的。例如,如果您按顺序推送以下数字

    5 - 2 - 6 - 8 - 1

    max_stack将包含

    5 - 5 - 6 - 8 - 8

    以及pop的数字,当前max将位于顶部。

    我希望解决方案很明确。