假设我们要制作一个最大的堆栈,它支持以下操作-
MaxStk() 这将构造一个最大堆栈的新实例
push(val) 将val插入堆栈
top() 从堆栈中获取最高的元素
max() 从堆栈中获取最大元素
pop() 从堆栈中删除并返回最上面的元素
popmax() 从堆栈中删除并返回最大元素
现在通过调用构造的最大堆栈MasStk(),然后推像5,15,10,然后调用三个值top(),max(),popmax(),max() pop(),top()分别功能。那么初始堆栈状态将为[5、15、10],以及该功能的相应输出:10、15、15、10、10、5
为了解决这个问题,我们将遵循以下步骤-
pos_index:= 0
定义一个set stk另一个set aux
定义构造函数,这没有做任何特殊的任务
定义一个函数push(),将需要val,
将pos_index,val插入stk
将val,pos_index插入aux
(将pos_index增加1)
定义功能 top()
如果stk为空,则-
返回-1
返回stk的第一项的第二个值
定义功能 max()
如果aux为空,则-
返回-1
返回aux的第一项的第一个值
定义功能 pop()
如果stk为空,则-
返回-1
id:= stk的第一项的第一个值,ret = stk的第一项的第二个值
从stk删除stk的第一个元素
从aux删除对(ret,id)
返回ret
定义功能 popmax()
如果aux为空,则-
返回-1
ret:= aux的第一项的第一个值,id = aux的第一项的第二个值
从aux删除aux的第一个元素
pair(id, ret)从stk删除
返回ret
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class MaxStk { int pos_index = 0; set<pair<int, int>, greater<>> stk, aux; public: MaxStk() {} void push(int val) { stk.emplace(pos_index, val); aux.emplace(val, pos_index); pos_index++; } int top() { if (stk.empty()) return −1; return stk.begin()−>second; } int max() { if (aux.empty()) return −1; return aux.begin()−>first; } int pop() { if (stk.empty()) return −1; int id = stk.begin()−>first, ret = stk.begin()−>second; stk.erase(stk.begin()); aux.erase({ret, id}); return ret; } int popmax() { if (aux.empty()) return −1; int ret = aux.begin()−>first, id = aux.begin()−>second; aux.erase(aux.begin()); stk.erase({id, ret}); return ret; } }; int main(){ MaxStk max_stk; max_stk.push(5); max_stk.push(15); max_stk.push(10); cout << max_stk.top() << endl; cout << max_stk.max() << endl; cout << max_stk.popmax() << endl; cout << max_stk.max() << endl; cout << max_stk.pop() << endl; cout << max_stk.top() << endl; }
max_stk.push(5) max_stk.push(15) max_stk.push(10) max_stk.top() max_stk.max() max_stk.popmax() max_stk.max() max_stk.pop() max_stk.top()输出结果
10 15 15 10 10 5
我试过下面的程序。创建此程序的目的是了解有关堆栈大小的更多信息。 执行上述代码后,由于堆栈大小分配过大,程序崩溃。堆栈的最大可能大小是多少?是否为每个程序/计算机固定?可以增加吗? 我想知道是为了知识。如果有人能提供C/C中的例子,那将是非常有帮助的。
在互联网上看到这个问题并试图解决它。我可以解决堆是严格二叉树的情况(通过重复分区前序遍历),但当堆只是一棵完整的二叉树时,我无法找出算法。 例如,如果 是最小堆的预序遍历, 堆的大小为 是堆中的第一个元素(考虑到堆表示为数组) 下一个元素将位于的左子树中 将位于 的左侧子树中 最后一个 个元素将位于 的右子树中 将位于 的右侧子树中 可以通过递归地应用这个逻辑来构造完整的堆。 该解决方案将适用于此
问题内容: 如何确定Linux中程序的当前堆栈大小? 据说每个程序的堆栈大小在Linux中将是8 MB,但是当您使用cat / proc // mmap时,它将显示不同的大小。 另外,如何确定相关线程的堆栈大小?既然说线程有自己的私有堆栈? 问题答案: 如果仅需要当前的堆栈大小,则可以在main()的顶部声明一个变量,获取其地址,然后将其与在定义“当前”的位置声明的变量的地址进行比较。差异应为堆栈
问题内容: JVM运行时数据区为每个正在执行的方法提供单独的堆栈。它包含操作数堆栈和局部变量。每次加载变量时,都需要先到操作数堆栈,然后再到局部变量。为什么不直接操作局部变量表,并进行一些看似重复的工作? 问题答案: 具有直接操作数的指令集必须对每个指令中的操作数进行编码。相反,对于使用操作数堆栈的指令集,操作数是隐式的。 当查看小的琐碎运算(例如将常量加载到变量中)时,隐式参数的优势并不明显。本
本文向大家介绍数据结构中的最大WBLT操作,包括了数据结构中的最大WBLT操作的使用技巧和注意事项,需要的朋友参考一下 在这里,我们将看到什么是不同的Max-WBLT操作。HBLT具有不同的操作,例如插入,删除和初始化。它们也与WBLT非常相似。但是,融合操作可以在一次从上到下的过程中完成。 WBLT可以进行单遍熔合操作。因为我们可以在下降的过程中找到w值。我们可以根据需要更新w值并交换子树。对于
本文向大家介绍在C ++中执行给定操作后,数组中最大数目的相等数,包括了在C ++中执行给定操作后,数组中最大数目的相等数的使用技巧和注意事项,需要的朋友参考一下 给我们一个整数数组。目标是在执行给定操作后找到数组中等于的最大数- 选择两个元素a [i]和a [j],使i!= j和 递增a [i]并递减a [j](a [i] ++,a [j]-) 我们将取数组的总和除以元素数。如果N是数组的大小,