C++栈混洗

在阅读此篇文章的时候我们要先知道什么是栈,以及常用接口

最近学stack的时候接触到了栈混洗这个概念,那我我就以我浅薄的知识来讲一讲我的理解

1、我们用尖括号表示一个栈的栈顶,方括号表示栈底

 

 将一个栈放入到另一个栈需要用到一个中转,当全部完成的时候,A全部放入B中,新排列B称之为A的栈混洗

 同一输入序列完全可能导出不同的栈混洗序列,打个比方,

1、A是[1,2,3>,S是中转,放入B,可以直接把3,2,1依次放到S,S就是[3,2,1>,放入到B中就是B[1,2,3>

2、A是[1,2,3>,S是中转,放入B,先把A的栈顶3放入S,然后直接放入B,B的栈底就是3,然后A[1,2>依次放入S,S[2,1>,放入B[3>,B变为[3,1,2>

3、反例子:A为<1,2,3],B为[3,1,2> B不是A的栈混洗,为什么?大家可以思考一下

因为首先3在B是栈底,在A也是,那么意味着,S中转需要<3,2,1]按照顺序放入中转,然后3放入B,也就成为了B的栈底,此时<2,1],显然很明显,只能放入B,毕竟规则是不让放回A的,所以结果应该是B<1,2,3]

4、{1,2,3,4}和{3,1,2,4}是否是{1,2,3,4}的栈混洗? 可以告诉大家答案是否定的

这里我们默认左边是栈顶右边是栈底

第一个1,2,3,4没什么好说的,入栈放入中转为4,3,2,1,然后放入就变回1,2,3,4

第二个3,1,2,4,也很好测试,1,2,3,4入栈,4为栈顶出栈,还是用S表示中转,S此时3,2,1,我们3是栈顶,我们根本没办法做到要求的第二个元素是2,那么自然而然就是错误的,不需要再计算

相信大家看完肯定还有很多的疑问,比如:不同的序列有多少个不同的栈混洗,他们的规律是什么,有什么公式如何计算,那么就再出一个题目

5、长度为4的序列共有多少个不同的栈混洗?答案是14

推荐大家看看邓俊辉老师对这一章节的描述,要比我的可能好很多数据结构(上) - 清华大学 - 学堂在线

以及力扣的第946题,足以帮助大家对这些有一个不错的理解

力扣

顺便提供一个参考答案:

class Solution {
public:
    bool validateStackSequences(vector<int> pushed, vector<int> popped) {
        stack <int>s;
        int count = 0;
        for (int i = 0; i < pushed.size(); i++) {
            s.push(pushed[i]);
            while (!s.empty() && s.top() == popped[count]) {
                s.pop();
                count++;
            }
        }
        if (!s.empty())
            return false;
        else
            return true;
    }
};

 如有错误还请指正,所有使用放入这个词都表示完成了从A出栈到某个地方入栈的过程,还请注意

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值