【面试题】判断一个序列是不是栈的输出序列

题目描述:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。比如输入的push序列是1、2、3、4、5、6、7,那么2、1、4、3、7、6、5就有可能是一个pop系列。但序列4、3、5、1、2、7、6就不可能是push序列1、2、3、4、5的pop序列。

问题分析:解决这个问题我们可以申请一个栈,然后从输入序列开头一个一个判断是否等于输出序列的头。举个简单的例子。比如输入序列为1、2、3、4输出序列为3、4、2、1,这是输出序列第一个数字为3,我们就从输入序列开始寻找3,直到找到3,而假如3之前有数据我们就把它们存入栈中,在输入序列中,开始碰到的是1元素,和输出序列的第一个元素不相等,我们就把1放入栈中,然后就是2元素,也不想等,也放入栈中,然后就是3,这时候和输出序列的第一个元素相等,我们就把输出序列的下标移到2,而输入序列的下标移到3,这时候输出序列的元素为4,先个栈顶元素比较,发现不相等,这时候元素要么在输入序列的后面,要么就没有,我们在输入序列里面寻找,此时的出入序列指到元素4正好和输出序列的元素相等,于是我们把输出序列和输入序列的下标都加上1,此时输入序列已经弄完了,而输出序列指着2,我们也先和栈顶元素比较,发现它们相等,于是我们把栈顶元素删除,同时输出序列的下标加1,这时候输出序列直到元素1,我们再和栈顶元素比较,发现它们相等,于是我们把栈顶元素删除,同时输出序列的下标加1。这时候我们发现栈为空,而且输入序列的下标已经直到输入序列的末尾,这说明输出序列是栈的输出序列,我们返回true,否则我们返回false;代码实现如下所示:

  1. #include <iostream>  
  2. /* 
  3. *     author: w397090770 
  4. *     Email:wyphao.2007@163.com 
  5. *     仅用于学习交流之用 
  6. **/  
  7. #include <vector>  
  8. #include <stack>  
  9.   
  10. using namespace std;  
  11.   
  12. bool IsPopOrder(const vector<int> & Push, const vector<int> & Pop){  
  13.     if(Push.size() != Pop.size()){  
  14.         return false;  
  15.     }  
  16.       
  17.     stack<int>temp;  
  18.     int tempIndex = 0;  
  19.     int tempIndex2 = 0;  
  20.     int Size = Pop.size();  
  21.       
  22.     while(tempIndex2 < Size){  
  23.         for(; tempIndex < Size; tempIndex++){  
  24.             if(Push[tempIndex] == Pop[tempIndex2]){  
  25.                 tempIndex2++;  
  26.                 tempIndex++;  
  27.                 break;  
  28.             }  
  29.             temp.push(Push[tempIndex]);  
  30.         }  
  31.           
  32.         if(!temp.empty() && temp.top() != Pop[tempIndex2]){  
  33.               
  34.             for(; tempIndex < Size; tempIndex++){  
  35.                 if(Push[tempIndex] == Pop[tempIndex2]){  
  36.                     tempIndex2++;  
  37.                     tempIndex++;  
  38.                     break;  
  39.                 }  
  40.                 temp.push(Push[tempIndex]);  
  41.             }  
  42.         }else if(!temp.empty()){  
  43.             temp.pop();  
  44.             tempIndex2++;  
  45.         }  
  46.         if(!temp.empty() && tempIndex >= Size && temp.top() != Pop[tempIndex2]){  
  47.             return false;  
  48.         }else{  
  49.             while(!temp.empty() && temp.top() == Pop[tempIndex2]){  
  50.                 temp.pop();  
  51.                 tempIndex2++;  
  52.             }  
  53.         }  
  54.           
  55.     }  
  56.       
  57.     if(temp.empty() && tempIndex >= Size){  
  58.         return true;  
  59.     }  
  60.       
  61.     return false;  
  62. }  
  63. int main(){  
  64.     vector<int> Push, Pop;  
  65.     //1      1  
  66.     //1      2  
  67.     //1, 2, 3, 4, 5         3, 5, 4, 1, 2  
  68.     //1, 2, 3, 4, 5         4, 3, 5, 1, 2  
  69.     //1, 2, 3, 4, 5         3, 5, 4, 2, 1  
  70.     //1, 2, 3, 4, 5         4, 5, 3, 2, 1  
  71.     //1, 2, 3, 4, 5         3, 5, 4, 2, 1  
  72.     Push.push_back(1);  
  73.     Push.push_back(2);  
  74.     Push.push_back(3);  
  75.     Push.push_back(4);  
  76.     Push.push_back(5);  
  77.     Push.push_back(6);  
  78.     Push.push_back(7);  
  79.       
  80.     Pop.push_back(2);  
  81.     Pop.push_back(1);  
  82.     Pop.push_back(4);  
  83.     Pop.push_back(3);  
  84.     Pop.push_back(7);  
  85.     Pop.push_back(5);  
  86.     Pop.push_back(6);  
  87.   
  88.     cout << IsPopOrder(Push, Pop) << endl;  
  89.     return 0;  
  90. }  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值