前言
 
- 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失。
- 个人刷题练习系列专栏:个人CSDN牛客刷题专栏。 题目来自:牛客/题库 / 在线编程 / 剑指offer:
  
 
问题描述:
 
- 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
-  
  - 0<=pushV.length == popV.length <=1000
 
-  
  - -1000<=pushV[i]<=1000
 
-  
  - pushV 的所有数字均不相同
 
 
举例:
 
[1,2,3,4,5],[4,5,3,2,1]
true
[1,2,3,4,5],[4,3,5,1,2]
false
 
 
解法思路:
 
- 建立一个辅助栈,开始时,指针分别指向入栈数组pushV和出栈数组popV第一个元素,再让与当前出栈数组元素对应的入栈数组元素前的所有数入栈。此时栈顶元素与出栈数组元素相等,让栈顶元素出栈、出栈数组指针后移,继续判断直到不等。重复上述过程,直到入栈数组和出栈数组访问完毕,判断此时栈内是否还有元素。时间复杂度O(n),空间复杂度O(n)。
 
代码结果:
 
#include <stdbool.h>
bool IsPopOrder(int* pushV, int pushVLen, int* popV, int popVLen ) {
    
    int stack[pushVLen],top=-1,top_in=0,top_out=0;
    while(top_in<pushVLen && top_out<pushVLen){
        while(top_in<pushVLen && pushV[top_in]!=popV[top_out]){
            
            stack[++top]=pushV[top_in++];
        }
        stack[++top]=pushV[top_in++];
        while(top>-1 && stack[top]==popV[top_out]){
            
            top--;
            top_out++;
        }
    }
    if(top!=-1){
        return false;
    }
    return true;
}    
 
 
 
结束语
 
- 以上就是该C语言编程题的内容。可以在牛客尝试刷几道题目来练习实践。牛客网刷题(点击可以跳转),可以尝试注册使用。
- 题目来自:牛客/题库 / 在线编程 / 剑指offer:
 