js 根据入栈序列判断可能的出栈序列

根据入栈和出栈序列,分析判断出栈序列是否合法。若能按给定序列完成正常入栈出栈操作,则序列正确,反之则错误。提供两种思路:模拟过程和依据出栈元素规律进行验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

分别给定入栈序列和出栈序列,判断该出栈序列是否是可能的正确的出栈序列
比如入栈序列为 [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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值