码迷,mamicode.com
首页 > 其他好文 > 详细

栈的压入弹出序列

时间:2015-07-25 00:03:57      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

技术分享
首先来看图,来看下压入顺序是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. }













栈的压入弹出序列

标签:

原文地址:http://www.cnblogs.com/yml435/p/4675045.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!