Design a stack which supports the following operations.

    Implement the CustomStack class:

    • CustomStack(int maxSize) Initializes the object with maxSize which is the maximum number of elements in the stack or do nothing if the stack reached the maxSize.
    • void push(int x) Adds x to the top of the stack if the stack hasn’t reached the maxSize.
    • int pop() Pops and returns the top of stack or -1 if the stack is empty.
    • void inc(int k, int val) Increments the bottom k elements of the stack by val. If there are less than k elements in the stack, just increment all the elements in the stack.

    Example 1:

    1. Input
    2. ["CustomStack","push","push","pop","push","push","push","increment","increment","pop","pop","pop","pop"]
    3. [[3],[1],[2],[],[2],[3],[4],[5,100],[2,100],[],[],[],[]]
    4. Output
    5. [null,null,null,2,null,null,null,null,null,103,202,201,-1]
    6. Explanation
    7. CustomStack customStack = new CustomStack(3); // Stack is Empty []
    8. customStack.push(1); // stack becomes [1]
    9. customStack.push(2); // stack becomes [1, 2]
    10. customStack.pop(); // return 2 --> Return top of the stack 2, stack becomes [1]
    11. customStack.push(2); // stack becomes [1, 2]
    12. customStack.push(3); // stack becomes [1, 2, 3]
    13. customStack.push(4); // stack still [1, 2, 3], Don't add another elements as size is 4
    14. customStack.increment(5, 100); // stack becomes [101, 102, 103]
    15. customStack.increment(2, 100); // stack becomes [201, 202, 103]
    16. customStack.pop(); // return 103 --> Return top of the stack 103, stack becomes [201, 202]
    17. customStack.pop(); // return 202 --> Return top of the stack 102, stack becomes [201]
    18. customStack.pop(); // return 201 --> Return top of the stack 101, stack becomes []
    19. customStack.pop(); // return -1 --> Stack is empty return -1.

    Constraints:

    • 1 <= maxSize <= 1000
    • 1 <= x <= 1000
    • 1 <= k <= 1000
    • 0 <= val <= 100
    • At most 1000 calls will be made to each method of increment, push and pop each separately.

    题意

    实现一个拥有指定操作的栈。

    思路

    最简单的就是直接照着题目意思实现这个栈。

    也存在increment()方法为1381. Design a Stack With Increment Operation (M) - 图1的解法:[Java/C++/Python] Lazy increment, O(1))


    代码实现

    1. class CustomStack {
    2. private List<Integer> stack;
    3. private int maxSize;
    4. public CustomStack(int maxSize) {
    5. stack = new ArrayList<>();
    6. this.maxSize = maxSize;
    7. }
    8. public void push(int x) {
    9. if (stack.size() == maxSize) {
    10. return;
    11. }
    12. stack.add(x);
    13. }
    14. public int pop() {
    15. if (stack.size() == 0) {
    16. return -1;
    17. }
    18. return stack.remove(stack.size() - 1);
    19. }
    20. public void increment(int k, int val) {
    21. int pos = Math.min(k, stack.size());
    22. for (int i = 0; i < pos; i++) {
    23. stack.set(i, stack.get(i) + val);
    24. }
    25. }
    26. }

    代码实现 - O(1) increment()

    1. class CustomStack {
    2. private Deque<Integer> stack;
    3. private int maxSize;
    4. private int[] append;
    5. public CustomStack(int maxSize) {
    6. stack = new ArrayDeque<>();
    7. this.maxSize = maxSize;
    8. append = new int[maxSize];
    9. }
    10. public void push(int x) {
    11. if (stack.size() == maxSize) {
    12. return;
    13. }
    14. stack.push(x);
    15. }
    16. public int pop() {
    17. if (stack.size() == 0) {
    18. return -1;
    19. }
    20. int pos = stack.size() - 1;
    21. if (pos > 0) {
    22. append[pos - 1] += append[pos];
    23. }
    24. int res = stack.pop() + append[pos];
    25. append[pos] = 0;
    26. return res;
    27. }
    28. public void increment(int k, int val) {
    29. int pos = Math.min(k, stack.size()) - 1;
    30. if (pos >= 0) {
    31. append[pos] += val;
    32. }
    33. }
    34. }