用 C++ 设计一个带增量操作的栈
假设我们想要设计一个支持以下操作的栈。
CustomStack(int maxSize) 初始化对象,maxSize 是栈中元素的最大数量,如果栈已达到 maxSize,则不执行任何操作。
void push(int x) 如果栈尚未达到 maxSize,则将 x 插入栈顶。
int pop() 删除并返回栈顶元素,如果栈为空则返回 -1。
void inc(int k, int val) 将栈底的 k 个元素增加 val。如果栈中元素少于 k 个,则只增加栈中的所有元素。
为了解决这个问题,我们将遵循以下步骤:
定义两个数组 st 和 inc,并创建一个整数类型数据 cap
在初始化中,设置 cap := N 并将 inc 设置为一个大小为 N + 10 的新数组
对于 push(x) 方法,如果栈的大小不是 cap,则将 x 插入 st。
pop() 操作将如下所示:
如果 st 为空,则返回 -1
否则
栈顶 := 栈顶 + inc[栈顶索引]
如果栈有一些元素,则将 inc[st 的大小 - 2] 增加 inc[st 的大小 – 1]
inc[s 的大小 - 1] := 0
x := st 的最后一个元素
返回 x
inc() 方法的工作原理如下:
将 k 减 1
k := k 和 st 的大小 - 1 的最小值
如果 k < 0,则返回
将 inc[k] 增加 val。
示例 (C++)
让我们看看下面的实现,以便更好地理解:
#include <bits/stdc++.h> using namespace std; class CustomStack { public: vector <int> st; vector <int> inc; int cap; CustomStack(int N) { cap = N; inc = vector <int>(N + 10); } void push(int x) { if(st.size() == cap) return; st.push_back(x); } int pop() { if(st.empty()) return -1; else{ st.back() += inc[st.size() - 1]; if(st.size() - 1 > 0 ){ inc[st.size() - 2] += inc[st.size() - 1]; } inc[st.size() - 1] = 0; int x = st.back(); st.pop_back(); return x; } } void increment(int k, int val) { k--; k = min(k, (int)st.size() - 1); if(k < 0) return; inc[k] += val; } }; main(){ CustomStack ob(3); ob.push(1); ob.push(2); cout << ob.pop() << endl; ob.push(2); ob.push(3); ob.push(4); ob.increment(5, 100); ob.increment(2, 100); cout << ob.pop() << endl; cout << ob.pop() << endl; cout << ob.pop() << endl; cout << ob.pop() << endl; }
输入
See the main() in the program
输出
2 103 202 201 -1
广告