• 栈的压入弹出序列


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













  • 相关阅读:
    029- 位运算符
    028- 三目运算符
    027- 字符串链接运算符
    026- 布尔运算符
    lucene 结合数据库做搜索
    JDK 1.8判断集合种的元素是否存在相同
    Springboot 集成jpa使用
    json 的使用 Java对象转json
    Java 短信发送
    1 eclipse 离线安装activiti插件
  • 原文地址:https://www.cnblogs.com/yml435/p/4675045.html
Copyright © 2020-2023  润新知