class Solution {
  public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        // 处理序列为空情况
        if (sequence.size() == 0) return false;

        stack<int> s;
        int root = INT_MAX;
        // 以根,右子树,左子树顺序遍历
        for (int i = sequence.size() - 1; i >= 0; i--) {
            // 确定根后一定是在右子树节点都遍历完了,因此当前sequence未遍历的节点中只含左子树,左子树的节点如果>root则说明违背二叉搜索的性质
            if (sequence[i] > root) return false;
            // 进入左子树的契机就是sequence[i]的值小于前一项的时候,这时可以确定root
            while (!s.empty() && s.top() > sequence[i]) {
                root = s.top();
                s.pop();
            }
            // 每个数字都要进一次栈
            s.push(sequence[i]);
        }
        return true;
    }
};