【剑指Offer】队列的最大值&栈的最小值
队列的最大值
dataQueue作为主队列,负责元素出队列和入队列,maxQueue的队头始终是主队列中的元素最大值。
当入队列的元素大于 maxQueue的队尾时,将maxQueue队尾元素依次弹出,直到遇到大于入队元素的值。如果入队元素比maxQueue队尾元素小,则直接加入maxQueue。
这里的弹出和主队列是无关的,因为这些较小的值在主队列中会先于较大的值出队列,所以主队列中的最大值,始终是maxQueue的队头元素。
在主队列元素出队列的时候,比较出队元素和maxQueue的队头是否相等,相等则maxQueue队头一起出队列。
【这个的思路和生成窗口的最大数组是差不多的】
1 class MaxQueue { 2 private LinkedList<Integer> dataQueue; 3 private LinkedList<Integer> maxQueue; 4 public MaxQueue() { 5 this.dataQueue = new LinkedList<>(); 6 this.maxQueue = new LinkedList<>(); 7 } 8 9 public int max_value() { 10 if(maxQueue.isEmpty()){ 11 return -1; 12 } 13 return maxQueue.peek(); 14 } 15 16 public void push_back(int value) { 17 dataQueue.offer(value); 18 while(!maxQueue.isEmpty() && value > maxQueue.peekLast()){ 19 maxQueue.pollLast(); 20 } 21 maxQueue.offer(value); 22 } 23 24 public int pop_front() { 25 if(dataQueue.isEmpty()){ 26 return -1; 27 } 28 int x = dataQueue.pop(); 29 if(x == maxQueue.peek()){ 30 maxQueue.pop(); 31 } 32 return x; 33 } 34 }
栈的最小值
1 public class MinStack { 2 private Stack<Integer> minStack; 3 private Stack<Integer> dataStack; 4 public MinStack() { 5 this.minStack = new Stack<>(); 6 this.dataStack = new Stack<>(); 7 } 8 9 public void push(int x) { 10 dataStack.push(x); 11 if(x <= minStack.peek()){ 12 minStack.push(x); 13 } 14 } 15 16 public void pop() { 17 int x = dataStack.pop(); 18 if(x == minStack.peek()){ 19 minStack.pop(); 20 } 21 } 22 23 public int top() { 24 LinkedList<Integer> a = new LinkedList<>();26 return dataStack.peek(); 27 28 } 29 30 public int min() { 31 return minStack.peek(); 32 } 33 }