『牛客|数据结构|栈』栈的压入、弹出序列

简介: 基础算法无论在研究生面试还是求职面试都是十分重要的一环,这里推荐一款算法面试神器:牛客网-面试神器;算法题只有多刷勤刷才能保持思路与手感,大家赶紧行动起来吧(温馨提示:常见的面试问答题库也很nice哦)


🍁每日推荐:基础算法无论在研究生面试还是求职面试都是十分重要的一环,这里推荐一款算法面试神器:牛客网-面试神器;算法题只有多刷勤刷才能保持思路与手感,大家赶紧行动起来吧(温馨提示:常见的面试问答题库也很nice哦)

如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦


1.每日一题

网络异常,图片无法展示
|

2.方法一:辅助栈

2.1思路分析

题目要我们判断两个序列是否符合入栈出栈的次序,我们就可以用一个栈来模拟。对于入栈序列,只要栈为空,序列肯定要依次入栈。那什么时候出来呢?自然是遇到一个元素等于当前的出栈序列的元素,那我们就放弃入栈,让它先出来。

//入栈:栈为空或者栈顶元素不等于出栈数组(注意还要控制数组越界j<n)

while(j<n&&(stack.isEmpty()||stack.peek()!=popA[i])){

   stack.push(pushA[j++]);

}

2.2具体做法

  • step 1:准备一个辅助栈,两个下标分别访问两个序列。
  • step 2:辅助栈为空或者栈顶不等于出栈数组当前元素,就持续将入栈数组加入栈中。
  • step 3:栈顶等于出栈数组当前元素就出栈。
  • step 4:当入栈数组访问完,出栈数组无法依次弹出,就是不匹配的,否则两个序列都访问完就是匹配的。

2.3代码题解

importjava.util.*;

importjava.util.ArrayList;

 

publicclassSolution {

   publicbooleanIsPopOrder(int [] pushA,int [] popA) {

       //元素的个数

       intn=pushA.length;

       //辅助栈

       Stack<Integer>stack=newStack<Integer>();

       //遍历入栈的下标

       intj=0;

       //遍历出栈数组,i为出栈数组下标

       for(inti=0;i<n;++i){

           //入栈:栈为空或者栈顶元素不等于出栈数组(注意还要控制数组越界j<n)

           while(j<n&&(stack.isEmpty()||stack.peek()!=popA[i])){

               stack.push(pushA[j++]);

           }

           //栈顶元素等于出栈数组中元素

           if(stack.peek()==popA[i]){

               stack.pop();

           }else{//否则为不匹配序列

               returnfalse;

           }

       }

       returntrue;

   }

}

网络异常,图片无法展示
|

3.方法二:原地栈

3.1思路分析

方法一我们使用了一个辅助栈来模拟,但是数组本来就很类似栈啊,用下标表示栈顶。在方法一中push数组前半部分入栈了,就没用了,这部分空间我们就可以用来当成栈。原理还是同方法一一样,只是这时我们遍历push数组的时候,用下标n表示栈空间,n的位置就是栈顶元素。

3.2具体做法

  • step 1:用下标i表示栈空间,用j表示出栈序列的下标。
  • step 2:遍历每一个待入栈的元素,加入栈顶,即push数组中i的位置,同时增加栈空间的大小,即i的大小。
  • step 3:当栈不为空即栈顶i大于等于0,且栈顶等于当前出栈序列,就出栈,同时缩小栈的空间,即减小i。
  • step 4:最后若是栈空间大小i为0,代表全部出栈完成,否则不匹配。

3.3代码题解

importjava.util.*;

importjava.util.ArrayList;

 

publicclassSolution {

   publicbooleanIsPopOrder(int [] pushA,int [] popA) {

       //栈空间的大小

       inti=0;

       //出栈序列下标

       intj=0;

       //遍历入栈数组

       for(inta:pushA){

           //将元素加入栈顶

           pushA[i]=a;

           //当栈不空且栈顶元素等于出栈数组元素时

           while(i>=0&&pushA[i]==popA[j]){

               j++;

               //元素出栈,缩小栈空间大小

               i--;

           }

           //为下一个元素入栈做准备

           i++;

       }

       //栈空间的大小为0说明元素全部出栈

       returni==0;

   }

}

网络异常,图片无法展示
|

🍁每日推荐:基础算法无论在研究生面试还是求职面试都是十分重要的一环,这里推荐一款算法面试神器:牛客网-面试神器;算法题只有多刷勤刷才能保持思路与手感,大家赶紧行动起来吧(温馨提示:常见的面试问答题库也很nice哦)


相关文章
|
17天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
91 9
|
8天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
16 1
|
10天前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
13天前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
15天前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
43 4
|
20天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
数据结构(栈与列队)
数据结构(栈与列队)
17 1
|
1月前
|
存储 JavaScript 前端开发
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
68 1
|
1月前
【数据结构】-- 栈和队列
【数据结构】-- 栈和队列
16 0
|
1月前
探索顺序结构:栈的实现方式
探索顺序结构:栈的实现方式