题1:
JZ30 包含min函数的栈
描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的 min 函数,输入操作时保证 pop、top 和 min 函数操作时,栈中一定有元素。 此栈包含的方法有: push(value):将value压入栈中 pop():弹出栈顶元素 top():获取栈顶元素 min():获取栈中最小元素 数据范围:操作数量满足 0 \le n \le 300 \0≤n≤300 ,输入的元素满足 |val| \le 10000 \∣val∣≤10000进阶:栈的各个操作的时间复杂度是 O(1)\O(1) ,空间复杂度是 O(n)\O(n)
示例: 输入: ["PSH-1","PSH2","MIN","TOP","POP","PSH1","TOP","MIN"] 输出: -1,2,1,-1 解析: "PSH-1"表示将-1压入栈中,栈中元素为-1 "PSH2"表示将2压入栈中,栈中元素为2,-1 “MIN”表示获取此时栈中最小元素==>返回-1 "TOP"表示获取栈顶元素==>返回2 "POP"表示弹出栈顶元素,弹出2,栈中元素为-1 "PSH1"表示将1压入栈中,栈中元素为1,-1
"TOP"表示获取栈顶元素==>返回1 “MIN”表示获取此时栈中最小元素==>返回-1
1 import java.util.Stack; 2 3 public class Solution { 4 Stack<Integer> s1=new Stack<>(); 5 Stack<Integer> s2=new Stack<>(); 6 7 public void push(int node) { 8 s1.push(node); 9 if (s2.isEmpty()||s2.peek()>=node) { 10 s2.push(node); 11 } 12 } 13 14 public void pop() { 15 int t=s1.pop(); 16 if (t==s2.peek()) s2.pop(); 17 } 18 19 public int top() { 20 return s1.peek(); 21 } 22 23 public int min() { 24 return s2.peek(); 25 } 26 }
思路:两个栈实现,第一个栈普通栈,第二个栈是递减的,放的数越来越小。出栈时如果是最小数,两个栈都得出栈。
题2:
JZ31 栈的压入、弹出序列
描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。 1. 0<=pushV.length == popV.length <=1000 2. -1000<=pushV[i]<=1000 3. pushV 的所有数字均不相同1 import java.util.*; 2 3 public class Solution { 4 public boolean IsPopOrder(int [] pushA,int [] popA) { 5 int p=0; 6 Stack<Integer> stack=new Stack<>(); 7 for (int t:pushA){ 8 stack.push(t); 9 while (!stack.isEmpty()&&stack.peek()==popA[p]){ 10 p++; 11 stack.pop(); 12 } 13 } 14 return stack.isEmpty(); 15 16 }}
思路:模拟。模拟压栈,如果栈顶元素与popA对应值相等,则出栈,popA指针向后移动。