【剑指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 }

 

posted @ 2020-05-29 21:46  xd会飞的猫  阅读(222)  评论(0编辑  收藏  举报