作者:敲代码の流川枫
博客主页:流川枫的博客
专栏:和我一起学java
语录:Stay hungry stay foolish
工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网
文章目录
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
1. 0<=pushV.length == popV.length <=1000
2. -1000<=pushV[i]<=1000
3. pushV 的所有数字均不相同
栈是一种仅支持在表尾进行插入和删除操作的线性表,这一端被称为栈顶,另一端被称为栈底。元素入栈指的是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;元素出栈指的是从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素
思路:
题目要我们判断两个序列是否符合入栈出栈的次序,我们就可以用一个栈来模拟。对于入栈序列,只要栈为空,序列肯定要依次入栈。那什么时候出来呢?自然是遇到一个元素等于当前的出栈序列的元素,那我们就放弃入栈,让它先出来
- //入栈:栈为空或者栈顶不等于出栈数组
- while(j < n && (s.isEmpty() || s.peek() != popA[i])){
- s.push(pushA[j]);
- j++;
- }
如果能按照这个次序将两个序列都访问完,那说明是可以匹配入栈出栈次序的
具体做法:
图示:
- import java.util.Stack;
- public class Solution {
- public boolean IsPopOrder(int [] pushA,int [] popA) {
- int n = pushA.length;
- //辅助栈
- Stack<Integer> s = new Stack<>();
- //遍历入栈的下标
- int j = 0;
- //遍历出栈的数组
- for(int i = 0; i < n; i++){
- //入栈:栈为空或者栈顶不等于出栈数组
- while(j < n && (s.isEmpty() || s.peek() != popA[i])){
- s.push(pushA[j]);
- j++;
- }
- //栈顶等于出栈数组
- if(s.peek() == popA[i])
- s.pop();
- //不匹配序列
- else
- return false;
- }
- return true;
- }
- }
复杂度分析:
思路:
方法一我们使用了一个辅助栈来模拟,但是数组本来就很类似栈,用下标表示栈顶。在方法一种push数组前半部分入栈了,就没用了,这部分空间我们就可以用来当成栈。原理还是同方法一一样,只是这时我们遍历push数组的时候,用下标n表示栈空间,n的位置就是栈顶元素。
具体做法:
- public class Solution {
- public boolean IsPopOrder(int [] pushA,int [] popA) {
- //表示栈空间的大小,初始化为0
- int n = 0;
- //出栈序列的下标
- int j = 0;
- //对于每个待入栈的元素
- for(int num : pushA){
- //加入栈顶
- pushA[n] = num;
- //当栈不为空且栈顶等于当前出栈序列
- while(n >= 0 && pushA[n] == popA[j]){
- //出栈,缩小栈空间
- j++;
- n--;
- }
- n++;
- }
- //最后的栈是否为空
- return n == 0;
- }
- }
复杂度分析:
“ 本期的分享就到这里了, 记得给博主一个三连哈,你的支持是我创作的最大动力!