【剑指Offer】栈的压入、弹出序列——双指针实现

该博客介绍了如何判断给定的两个整数序列,一个是栈的压入顺序,另一个是弹出顺序,是否能够匹配。通过分析问题关键,提出不依赖实际栈结构的解决方案,利用双指针和集合记录已出栈元素,实现判断。博主提供了C++代码实现此逻辑,重点在于指针的移动和集合的操作。
摘要由CSDN通过智能技术生成

1.牛客网链接:我是链接

2.题目描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有
数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就
不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
输入:栈的压入序列和弹出序列,例如压入序列{1,2,3,4,5},弹出序列{4,5,3,2,1}
输出:栈的弹出序列能否与栈的压入序列匹配(栈的弹出操作能否根据栈的压入顺序完成),能返回true,否则返回
false

3.题目分析:
我认为这道题的关键为:判断根据栈的弹出序列得到的栈顶元素弹出栈时,当前的栈顶是否为该元素。
在牛客的题解中有这一种思路:
(1)根据实际的栈数据结构(例如stack< int >)来判断:循环压入入栈序列的元素,当当前序列元素与当前出栈序列
元素相等时则执行出栈操作,最后在入栈元素全部压入(即循环结束后)判断栈内是否为空,如果为空则说明出栈序
列与入栈序列相匹配,函数返回true;如果栈内不为空说明出栈序列与入栈序列不匹配,返回false。

(2)我认为也可以不使用实际的栈结构解决这个问题:

  • a. 在某个元素出栈之前,需要栈中压入该元素,所以指向入栈序列的指针 int u 和出栈序列的指针 int o 可以理解
    为:出栈序列指针 int o 指向了当前需要出栈的元素,入栈序列指针 int u 指向了栈的栈顶元素(入栈序列可以看成一
    个动态变化的栈,序列下标的增大可以看成是元素的入栈,下标的减小可以看成是元素的出栈),并且使用set< int >
    index结构记录已经出栈过的元素(因为入栈序列没有相同的元素,出栈序列也一样)。
  • b. 循环遍历出栈序列 popV:当 popV[o] == pushV[u] 时 index.insert(popV[o])记录该元素已经出栈,并且将u置
    于当前的栈顶(while(u>0&&index.count(pushV[u]))u–);如果u==0或者popV[o] != pushV[u] ,则通过入栈操作
    找到popV[o] (在pushV中通过循环找到popV[o]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值