栈的压入弹出序列



首先来看图,来看下压入顺序是1、2、3、4、5.弹出顺序是4、5、3、2、1

的情况下的栈的顺序:

是这样没错。怎么来的呢?


我们结合压入和弹出的数组来考虑。

首先我看弹出的数组:

为什么4在最开始处呢?压入顺序是:

说明这个栈里己经有了1、2、3、4

于是我们弹出4。

现在弹出顺出数组里指向了5

现在我们栈里没有5啊?哪来的5。于是我们先压入5.

再弹出5

于是看我们的弹出数组现在指向了3

我们栈里第一个就是3,那么弹出3

同样我们弹出2,然后弹出1

现在栈变为空了。

其实上面我们采用了逆向思维的方式,我们从弹出的数组顺序中开始推测以前的压入顺序,倒过来模拟以前的那个栈的工作过程。

如果模拟过程中压入的数字正好和我们弹出的数组相配套,那么最后栈定是空的,否则就不为空嘛。


源代码:

  1. #ifndef IS_STACK_SEQ_H
  2. #define IS_STACK_SEQ_H
  3. #include<stack>
  4. #include<iostream>
  5. bool isStackSeq(int *arrPush,int *arrPop,int Length){
  6. if(arrPush==NULL||arrPop==NULL||Length==0){
  7. throw("invalid input ");
  8. return false;
  9. }
  10. std::stack<int> stack_pop;
  11. std::stack<int> stack_push;
  12. for(int i=0;i<Length; i++){
  13. stack_pop.push(arrPop[i]);
  14. }
  15. int *arrPushEnd=arrPush+Length-1;
  16. while(arrPush<=arrPushEnd){
  17. while(*arrPush!=stack_pop.top()){
  18. stack_push.push(*arrPush);
  19. arrPush++;
  20. }
  21. arrPush++;
  22. stack_pop.pop();
  23. }
  24. while(stack_push.size()!=0){
  25. if(stack_pop.top()!=stack_push.top()){
  26. return false;
  27. }else{
  28. stack_pop.pop();
  29. stack_push.pop();
  30. }
  31. }
  32. return true;
  33. }
  34. #endif

测式:

  1. #include"isTheStackSeq.h"
  2. #include<iostream>
  3. int main(){
  4. int push[5]={1,2,3,4,5};
  5. int pop[5]={5,4,3,2,1};
  6. std::cout<<isStackSeq(push,pop,5);
  7. }

来自为知笔记(Wiz)

时间: 2024-12-14 07:43:56

栈的压入弹出序列的相关文章

【剑指offer】栈的压入弹出序列

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26077863 剑指offer上的第22题,九度OJ上AC. 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列. 输入: 每个测试案例包括3行: 第一行为1个整数n(

剑指Offer:栈的压入/弹出序列

栈的压入/弹出序列 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列.(注意:这两个序列的长度是相等的) class Solution { public: bool IsPopOrder(vector<int> pushV,vector<int> popV) { //

九度 1366 栈的压入弹出序列

题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列. 输入: 每个测试案例包括3行: 第一行为1个整数n(1<=n<=100000),表示序列的长度. 第二行包含n个整数,表示栈的压入顺序. 第三行包含n个整数,表示栈的弹出顺序. 输出: 对应每个测试案例,如果第二个序列是

栈的压入 弹出序列

template<typename T> bool isPopOrder(vector<T> vec, vector<T> order) { stack<T> sta; if(vec.size() != order.size()) { return false; } int i = 0, j = 0; while(j < order.size()) { if(i < vec.size() && order[j] == vec[i]

剑指Offer20 栈的压入弹出序列是否正确

1 /************************************************************************* 2 > File Name: 20_IsPopOrder.cpp 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年08月30日 星期二 19时53分19秒 6 **************************************

剑指offer-栈的压入弹出序列21

题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列.(注意:这两个序列的长度是相等的) class Solution: def IsPopOrder(self, pushV, popV): # write code here lenpushV=len(pushV) lenp

剑指offer-面试题31-栈的压入弹出序列-栈

#include<iostream> #include<string.h> #include<algorithm> #include<cmath> #include<stdio.h> /* 题目: 输入两个整数序列,第一个序列1表示栈的压入顺序,第二个序列2表示栈的弹出顺序. 判断第一个栈是否可以以第二个序列的方式弹出. */ /* 思路: 设置一个辅助栈,遍历序列2. 若遍历到的序列2的元素与栈顶元素相同,则弹出栈,遍历下一个元素: 若遍历到的

剑指offer 栈的压入弹出 顺序

判断: 如果下一个弹出的数字刚好是栈顶元素,那么直接弹出 如果下一个弹出的数字不在栈顶,我们要把压栈序列中,还没有入栈的数字压入辅助栈,知道把下一个需要弹出的数字压入栈顶 如果所有的数字都入栈,但是仍然没有找到下一个弹出的数字,那么该序列不可能为弹出序列. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 class Solution { public:     bool IsPopOrder(vector<int> 

【35】栈的压入弹出判断

题目: 给定两个整数序列,第一个序列是栈的压入序列,判断第二个是不是栈的弹出序列?假设不重复,比如1,2,3,4,5和4,5,3,2,1 思路: 如果下一个弹出的数字刚好是栈顶数字,那么弹出.不在栈顶,持续压入,知道弹出的数字和栈顶一样,如果压完,还没找到,那么返回false. 代码: boolean isPopOrder(int[] push,int[] pop,int length){ boolean possible = false; int i = 0; int j = 0; Stack