Java中Deque与Stack

Posted Panda_Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中Deque与Stack相关的知识,希望对你有一定的参考价值。

1. Deque

  1. 允许两头都进,两头都出,这种队列叫双端队列(Double Ended Queue),简称Deque。
  2. Java集合提供了接口Deque来实现一个双端队列,它的功能:
    ①既可以添加到队尾,也可以添加到队首;
    ②既可以从队首获取,又可以从队尾获取
  3. Deque接口实际上扩展自Queue:
public interface Deque<E> extends Queue<E> {
    ...
}
  1. Deque是一个接口,它的实现类有ArrayDeque和LinkedList。
Deque<String> d2 = new LinkedList<>();

2. Stack

  1. Stack的入栈和出栈的操作:
    ①把元素压栈:push(E);
    ②把栈顶的元素“弹出”:pop(E);
    ③取栈顶元素但不弹出:peek(E)。

  2. 在Java中,我们用Deque可以实现Stack的功能:
    ①把元素压栈:push(E)/addFirst(E);
    ②把栈顶的元素“弹出”:pop(E)/removeFirst();
    ③取栈顶元素但不弹出:peek(E)/peekFirst()。

  3. Java的集合类并没有单独的Stack接口,因为有个遗留类名字就叫Stack,出于兼容性考虑,所以没办法创建Stack接口,只能用Deque接口来“模拟”一个Stack了。

  4. 当我们把Deque作为Stack使用时,注意只调用push()/pop()/peek()方法,不要调用addFirst()/removeFirst()/peekFirst()方法,那样会破坏栈的本质。

3. leetcode98. 验证二叉搜索树

class Solution {
    public boolean isValidBST(TreeNode root) {
        Deque<TreeNode> stack = new LinkedList<TreeNode>();
        double inorder = -Double.MAX_VALUE;

        while (!stack.isEmpty() || root != null) {
            while (root != null) {
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
              // 如果中序遍历得到的节点的值小于等于前一个 inorder,说明不是二叉搜索树
            if (root.val <= inorder) {
                return false;
            }
            inorder = root.val;
            root = root.right;
        }
        return true;
    }
}

以上是关于Java中Deque与Stack的主要内容,如果未能解决你的问题,请参考以下文章

C++初阶----deque(双端队列)+stack queue模拟实现

从deque到std::stack,std::queue,再到iOS 中NSArray(CFArray)

为啥要使用 Deque 而不是内置 Stack<>? [复制]

为啥要使用 Deque 而不是内置 Stack<>? [复制]

C++STL之stack和queue以及deque详解

C++STL之stack和queue以及deque详解