LeetCode-Algorithms-[Easy]716. 最大栈

716. 最大栈 

	public class MaxStack {
		Stack<Integer> s;
		int max;

		/** initialize your data structure here. */
		public MaxStack() {
			s = new Stack<Integer>();
		}

		public void push(int x) {
			if (s.isEmpty()) {
				max = x;
			}
			max = Math.max(x, max);
			s.push(x);
		}

		public int pop() {
			int res = s.pop();
			if (res == max && !s.isEmpty()) {
				max = findMax();
			}
			return res;
		}

		public int top() {
			int res = s.peek();
			return res;
		}

		public int peekMax() {
			return max;
		}

		public int popMax() {
			Stack<Integer> temp = new Stack<Integer>();
			int res = max;
			while (!s.isEmpty()) {
				int num = s.pop();
				if (num == max) {
					break;
				}
				temp.push(num);
			}
			while (!temp.isEmpty()) {
				int numTemp = temp.pop();
				s.push(numTemp);
			}
			if (!s.isEmpty()) {
				max = findMax();
			}
			return res;
		}

		private int findMax() {
			int res = s.peek();
			Stack<Integer> sCopy = (Stack<Integer>)s.clone();
			while (!sCopy.isEmpty()) {
				int num = sCopy.pop();
				res = Math.max(res, num);
			}
			return res;
		}
	}

 

官方题解1 

class MaxStack {
    Stack<Integer> stack;
    Stack<Integer> maxStack;

    public MaxStack() {
        stack = new Stack();
        maxStack = new Stack();
    }

    public void push(int x) {
        int max = maxStack.isEmpty() ? x : maxStack.peek();
        maxStack.push(max > x ? max : x);
        stack.push(x);
    }

    public int pop() {
        maxStack.pop();
        return stack.pop();
    }

    public int top() {
        return stack.peek();
    }

    public int peekMax() {
        return maxStack.peek();
    }

    public int popMax() {
        int max = peekMax();
        Stack<Integer> buffer = new Stack();
        while (top() != max) buffer.push(pop());
        pop();
        while (!buffer.isEmpty()) push(buffer.pop());
        return max;
    }
}

作者:LeetCode
链接:https://leetcode-cn.com/problems/max-stack/solution/max-stack-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

官方题解2

class MaxStack {
    TreeMap<Integer, List<Node>> map;
    DoubleLinkedList dll;

    public MaxStack() {
        map = new TreeMap();
        dll = new DoubleLinkedList();
    }

    public void push(int x) {
        Node node = dll.add(x);
        if(!map.containsKey(x))
            map.put(x, new ArrayList<Node>());
        map.get(x).add(node);
    }

    public int pop() {
        int val = dll.pop();
        List<Node> L = map.get(val);
        L.remove(L.size() - 1);
        if (L.isEmpty()) map.remove(val);
        return val;
    }

    public int top() {
        return dll.peek();
    }

    public int peekMax() {
        return map.lastKey();
    }

    public int popMax() {
        int max = peekMax();
        List<Node> L = map.get(max);
        Node node = L.remove(L.size() - 1);
        dll.unlink(node);
        if (L.isEmpty()) map.remove(max);
        return max;
    }
}

class DoubleLinkedList {
    Node head, tail;

    public DoubleLinkedList() {
        head = new Node(0);
        tail = new Node(0);
        head.next = tail;
        tail.prev = head;
    }

    public Node add(int val) {
        Node x = new Node(val);
        x.next = tail;
        x.prev = tail.prev;
        tail.prev = tail.prev.next = x;
        return x;
    }

    public int pop() {
        return unlink(tail.prev).val;
    }

    public int peek() {
        return tail.prev.val;
    }

    public Node unlink(Node node) {
        node.prev.next = node.next;
        node.next.prev = node.prev;
        return node;
    }
}

class Node {
    int val;
    Node prev, next;
    public Node(int v) {val = v;}
}

作者:LeetCode
链接:https://leetcode-cn.com/problems/max-stack/solution/max-stack-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值