SOURCE

let st = [], res = [] // 全局变量

// 1、组合  (无序)
function tract(arr, k, start = 0) {
    let len = arr.length
    if(st.length === k) {
        res.push([...st])
        return
    }
    
    for(let i = start; i < len; i++) {
        st.push(arr[i])
        tract(arr,k,i+1)
        st.pop()
    }
    return res
}

// 2、排列 (有序)
let used = []
function combine(arr, len) {
    if(len === st.length) {
        res.push([...st])
        return
    }

    for(let i=0; i<arr.length; i++) {
        if(!used[i]) {
            used[i] = true
            st.push(arr[i])
            combine(arr, len)
            st.pop()
            used[i] = false
        }
    }
    return res
}


// 根据入栈顺序检查出栈的顺序是否正确
/*
** @params: ins:入栈顺序, outs:出栈顺序
** @return:布尔值
*/
function check(ins, outs) {
    let st= [], j = 0
    for(let i=0; i<ins.length; i++) {
        st.push(ins[i])
        while(st.length !== 0) {
            if(st[st.length-1] === outs[j]) {
                // 如果st栈顶元素是和outs出栈元素相同就出栈
                st.pop()
                j++
            } else {
                // 如果不同继续入栈st
                break
            }
        }
    }
    return st.length === 0
}
// *** test ***

// console.log(combine([1, 2, 3], 3))
// console.log(tract(['a', 'b', 'c'], 3))

console.log(check([1,2,3], [3,1,2]))
console 命令行工具 X clear

                    
>
console