import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param op string字符串一维数组
     * @param vals int整型二维数组
     * @return int整型一维数组
     */
    Stack<Integer> s;
    Stack<Integer> maxs;

    public int[] max_weight_cow (String[] op, int[][] vals) {
        // write code here
        int[] res = new int[op.length];
        s = new Stack<>();
        maxs = new Stack<>();

        for (int i = 0; i < op.length; i++) {
            if (op[i].equals("MaxCowStack")) {
                res[i] = -1;
            } else if (op[i].equals("push")) {
                s.push(vals[i][1]);
                if (maxs.isEmpty() || vals[i][1] > maxs.peek()) {
                    maxs.push(vals[i][1]);
                }
                res[i] = -1;
            } else if (op[i].equals("pop")) {
                int val = s.pop();
                if (maxs.peek() == val) {
                    maxs.pop();
                }
                res[i] = -1;
            } else if (op[i].equals("top")) {
                res[i] = s.peek();
            } else if (op[i].equals("getMax")) {
                res[i] = maxs.peek();
            }
        }

        return res;
    }
}

该代码使用的编程语言是Java。

这道题考察的是栈的基本操作和使用。

代码的详细文字解释如下:

  1. 首先定义了一个 Solution 类,其中包含两个栈 s 和 maxs,分别用于保存数据和保存当前栈中的最大值。
  2. max_weight_cow 方法是解决问题的入口函数。它接收两个参数,一个是字符串类型的操作序列 op,另一个是整型二维向量 vals,表示对应操作的值。方法返回一个整型向量 res,用于保存每个操作的结果。
  3. 在方法内部,首先创建一个大小为 op.size() 的整型向量 res,用于保存每个操作的结果。
  4. 然后,通过遍历操作序列 op,对每个操作进行处理。
  5. 如果操作是 "MaxCowStack",则将结果向量 res 中对应位置的元素置为 -1,表示无需返回结果。
  6. 如果操作是 "push",则将 vals 中对应位置的值压入栈 s 中,并判断栈 maxs 是否为空,或者新的值是否比栈顶元素大。如果是,则将新的值压入栈 maxs 中。
  7. 如果操作是 "pop",则从栈 s 中弹出一个值,并判断该值是否与栈 maxs 的栈顶元素相等。如果是,则也将栈 maxs 的栈顶元素弹出。
  8. 如果操作是 "top",则将栈 s 的栈顶元素赋值给结果向量 res 中对应位置的元素。
  9. 如果操作是 "getMax",则将栈 maxs 的栈顶元素赋值给结果向量 res 中对应位置的元素。
  10. 最后,返回结果向量 res。

通过使用两个栈,一个用于保存数据,一个用于保存当前栈中的最大值,实现了在常数时间内获取栈中的最大值。