使用 C++ 设计一个具有增量操作的堆栈

c++server side programmingprogramming

假设我们要设计一个支持以下操作的堆栈。

  • CustomStack(int maxSize) 这会使用 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[顶部索引stack]

    • 如果 stack 有某个元素,则将 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

相关文章