题目描述
分别给定入栈序列和出栈序列,判断该出栈序列是否是可能的正确的出栈序列
比如入栈序列为 [1, 2, 3, 4, 5]
,出栈序列为[3, 2, 5, 4, 1]
,则该出栈序列是正确的,因为可以按照下列入栈出栈顺序
入栈 1 => 入栈 2 => 入栈 3 => 出栈 3 => 出栈 2 => 入栈 4 => 入栈 5 => 出栈 5 => 出栈4 => 出栈 1
这种情况就返回true,如果按照给定的入栈出栈序列,无法正常完成入栈出栈操作,则返回false
代码实现
- 思路1,模拟入栈出栈过程,如果能正常完成入栈出栈过程,则出栈序列是对的
function isTrueOutStack (inStack, outStack) {
var stack = []
var pushUntil = outStack[0]
inStack = inStack.slice()
outStack = outStack.slice()
while (inStack.length > 0) {
// push
while (1) {
stack.push(inStack.shift())
if (stack[stack.length-1] === pushUntil) break
}
// pop
while (stack[stack.length-1] === outStack[0]){
// console.log(stack, outStack)
stack.pop()
outStack.shift()
if (stack.length <= 0 ) break
}
pushUntil = outStack[0]
}
if (stack.length === 0) return true
return false
}
- 思路2,根据规律:
任何出栈的元素后面出栈的元素必须满足以下三点:
1、在原序列中相对位置比它小的,必须是逆序;
2、在原序列中相对位置比它大的,顺序没有要求;
3、以上两点可以间插进行。
参考
function isTrueOutStack2 (inStack, outStack) { // 根据规律来判断
if (inStack.length !== outStack.length) return false
var result = true
var indexs = new Map()
inStack.forEach((item, index) => {
indexs.set(item, index)
})
var tmp = [], index
for (var i=0; i<outStack.length-1; i++) {
tmp.length = 0
index = indexs.get(outStack[i])
for (var j=i+1; j<outStack.length; j++) {
if (indexs.get(outStack[j]) >= index) continue
tmp.push(outStack[j])
}
// console.log(outStack[i], index, tmp)
for (var k=0; k<tmp.length-1;k++) {
if (indexs.get(tmp[k]) < indexs.get(tmp[k+1])) {
result = false
break
}
}
}
return result
}
测试
var inStack, outStack, outStack1, outStack2, outStack3, outStack4, outStack5, outStack6
inStack = [1, 2, 3, 4, 5]
outStack = [3, 2, 5, 1, 4]
console.log(isTrueOutStack (inStack, outStack)) // false
console.log(isTrueOutStack2 (inStack, outStack)) // false
inStack = [1, 2, 3, 4, 5]
outStack = [3, 2, 5, 4, 1]
console.log(isTrueOutStack (inStack, outStack)) // true
console.log(isTrueOutStack2 (inStack, outStack)) // true
inStack = ['A', 'B', 'C', 'D', 'E', 'F']
outStack1 = ['D', 'E', 'F', 'C', 'B', 'A']
outStack2 = ['D', 'C', 'E', 'F', 'B', 'A']
outStack3 = ['F', 'E', 'D', 'C', 'B', 'A']
outStack4 = ['F', 'E', 'C', 'D', 'B', 'A']
outStack5 = ['A', 'B', 'C', 'D', 'E', 'F']
outStack6 = ['A', 'D', 'C', 'B', 'F', 'E']
console.log('=====')
console.log(isTrueOutStack (inStack, outStack1)) // true
console.log(isTrueOutStack (inStack, outStack2)) // true
console.log(isTrueOutStack (inStack, outStack3)) // true
console.log(isTrueOutStack (inStack, outStack4)) // false
console.log(isTrueOutStack (inStack, outStack5)) // true
console.log(isTrueOutStack (inStack, outStack6)) // true
console.log('====')
console.log(isTrueOutStack2 (inStack, outStack1)) // true
console.log(isTrueOutStack2 (inStack, outStack2)) // true
console.log(isTrueOutStack2 (inStack, outStack3)) // true
console.log(isTrueOutStack2 (inStack, outStack4)) // false
console.log(isTrueOutStack2 (inStack, outStack5)) // true
console.log(isTrueOutStack2 (inStack, outStack6)) // true