当前位置: 首页 > 编程笔记 >

用C ++中的给定操作构造最大堆栈的程序

红智鑫
2023-03-14
本文向大家介绍用C ++中的给定操作构造最大堆栈的程序,包括了用C ++中的给定操作构造最大堆栈的程序的使用技巧和注意事项,需要的朋友参考一下

假设我们要制作一个最大的堆栈,它支持以下操作-

  • 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为空,则-

  • 返回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是数组的大小,