import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param operations string字符串一维数组
     * @param values int整型一维数组
     * @return int整型一维数组
     */
    public int[] processStackOperations (String[] operations, int[] values) {
        // stack1用来存放入栈的元素
        Stack<Integer> stack1 = new Stack<>();
        // stack2用来存放每个元素入栈时,此时的最大值
        Stack<Integer> stack2 = new Stack<>();
	  	// 用来存储最大元素(会在stack2出栈的时候,更新maxNumber为栈顶元素,也就是stack2.peek())
        int maxNumber = Integer.MIN_VALUE;
	    // 用来存储返回值的集合,最后转数组返回
        ArrayList<Integer> arrayList = new ArrayList<>();
        for (int i = 0; i < operations.length; i++) {
            String operation = operations[i];
            if (operation.equals("push")) {
			  // 更新最大值 注意values[i],我原本以为push是按values的顺序,其实这边是按push操作的当前索引,此时values[i]是什么数值,就push什么数值
                maxNumber = Math.max(values[i],maxNumber);
			  // 放入此时最大值
                stack2.push(maxNumber);
			  // 放入节点
                stack1.push(values[i]);
            } else if (operation.equals("getMax")) {
			  // 返回此时stack2的栈顶元素就是最大值
                Integer number = stack2.peek();
                arrayList.add(number);
            } else if (operation.equals("pop")) {
			  // 如果stack1栈顶和stack2栈顶元素相等,此时又是pop操作,可能会把最大值更新
			  // 为什么是可能?因为如果栈里有两个相同的最大值,那么可能更新后还是相同的
                Integer stack1Number = stack1.peek();
                Integer stack2Number = stack2.peek();
                if (stack1Number.equals(stack2Number)) {
				  // 相等的话,stack2.pop()
                    stack2.pop();
				  // 更新最大值
                    maxNumber = stack2.peek();
                }
                stack1.pop();
            } else if (operation.equals("top")) {
			  // 直接返回栈1的栈顶元素即可
                arrayList.add(stack1.peek());
            }
        }
	  // 集合转数组进行返回
        int [] result = new int[arrayList.size()];
        for (int i = 0; i < arrayList.size(); i++) {
            result[i] = arrayList.get(i);
        }
        return result;
    }
}

本题知识点分析:

1.栈的出栈和入栈

2.集合的存取

3.集合转数组

4.数学模拟

本题解题思路分析:

1.stack1用来存放入栈的元素

2.stack2用来存放每个元素入栈时,此时的最大值

3.其他看注释就可以了,没过测试用例就需要修改细节,主要你想的可能跟它题目测试用例不太一样,稍微改下就行,如果不用额外空间的话,可以考虑维护差值

本题使用编程语言: Java

如果你觉得本篇文章对你有帮助的话,可以点个赞这支持一下,感谢~