假设我们要制作一个最大的堆栈,它支持以下操作-
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