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。
这道题考察的是栈的基本操作和使用。
代码的详细文字解释如下:
- 首先定义了一个 Solution 类,其中包含两个栈 s 和 maxs,分别用于保存数据和保存当前栈中的最大值。
- max_weight_cow 方法是解决问题的入口函数。它接收两个参数,一个是字符串类型的操作序列 op,另一个是整型二维向量 vals,表示对应操作的值。方法返回一个整型向量 res,用于保存每个操作的结果。
- 在方法内部,首先创建一个大小为 op.size() 的整型向量 res,用于保存每个操作的结果。
- 然后,通过遍历操作序列 op,对每个操作进行处理。
- 如果操作是 "MaxCowStack",则将结果向量 res 中对应位置的元素置为 -1,表示无需返回结果。
- 如果操作是 "push",则将 vals 中对应位置的值压入栈 s 中,并判断栈 maxs 是否为空,或者新的值是否比栈顶元素大。如果是,则将新的值压入栈 maxs 中。
- 如果操作是 "pop",则从栈 s 中弹出一个值,并判断该值是否与栈 maxs 的栈顶元素相等。如果是,则也将栈 maxs 的栈顶元素弹出。
- 如果操作是 "top",则将栈 s 的栈顶元素赋值给结果向量 res 中对应位置的元素。
- 如果操作是 "getMax",则将栈 maxs 的栈顶元素赋值给结果向量 res 中对应位置的元素。
- 最后,返回结果向量 res。
通过使用两个栈,一个用于保存数据,一个用于保存当前栈中的最大值,实现了在常数时间内获取栈中的最大值。