在阅读此篇文章的时候我们要先知道什么是栈,以及常用接口
最近学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出栈到某个地方入栈的过程,还请注意