剑指offer 栈的压入和弹出
题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。
例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
(注意:这两个序列的长度是相等的)
栈的特点:先进后出
算法思路:
1.利用一个辅助栈来模拟压入和弹出的操作
2.对输入的序列的元素,先入栈,如果栈不为空,就查看栈顶元素和弹出序列的值是否相同,
相同就把栈顶出栈,弹出序列的当前值往后移动一位,继续判断下一个压入序列的值与弹出序列的值有没有相同的。
具体做法:先将第一个元素放入栈中,这里是1,然后判断栈顶元素是不是出栈顺序的第一个元素,
这里是4,很显然1≠4,所以我们继续压栈,直到相等以后开始出栈,出栈一个元素,则将出栈顺序向后移动一位,直到不相等,
3.这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。
从题目分析:
入栈顺序:1,2,3,4,5
出栈顺序:4,5,3,2,1
步骤如下:
1.首先1入辅助栈,此时栈顶1≠4,继续入栈2
2.此时栈顶2≠4,继续入栈3
3.此时栈顶3≠4,继续入栈4
4.此时栈顶4=4,出栈4,弹出序列向后一位,此时为5,,辅助栈里面是1,2,3
5.此时栈顶3≠5,继续入栈5
6.此时栈顶5=5,出栈5,弹出序列向后一位,此时为3,,辅助栈里面是1,2,3
7.此时栈顶3=3,把3出栈,辅助栈里面还有1,2
8.此时栈顶2=2,把2出栈,辅助栈里面 还有1
9.此时栈顶1=1,把1出栈,辅助栈里为空,说明该序列是正确的出栈序列
Stack():方法说明:
peek() 表示的是查看堆栈顶部的对象,但不从堆栈中移除它。
push(E item) 表示的是把项压入堆栈顶部。
pop() 表示的是移除堆栈顶部的对象,并作为此函数的值返回该对象。
empty() 表示的是测试堆栈是否为空。
search(Object o) 表示的是返回对象在堆栈中的位置,以 1 为基数。
代码如下:
import java.util.Stack;
public class Solution {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
        Stack<Integer> stack = new Stack<>();
        if (pushA.length == 0 || popA.length == 0){
            return false;
        }
        int flag = 0;
        for (int i = 0; i < pushA.length; i++){
            stack.push(pushA[i]);
            while (!stack.isEmpty() && stack.peek() == popA[flag]){
                stack.pop();
                flag++;
            }
        }
        return stack.isEmpty();
    }
}
剑指offer 栈的压入和弹出的更多相关文章
- 剑指offer——栈的压入、弹出序列
		
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个栈是否为该栈的弹出顺序.假设压入栈的所有数字都不相等.例如序列1,2,3,4,5是某个栈的压入顺序,序列4,5,3,2,1是该栈序列的一 ...
 - 剑指Offer 栈的压入、弹出序列
		
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...
 - 用js刷剑指offer(栈的压入、弹出序列)
		
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...
 - 剑指offer--28.栈的压入、弹出序列
		
时间限制:1秒 空间限制:32768K 热度指数:300132 本题知识点: 栈 算法知识视频讲解 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假 ...
 - 剑指Offer-21.栈的压入、弹出序列(C++/Java)
		
题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...
 - 剑指offer22 栈的压入、弹出序列
		
写的一个代码,虽然正确通过了,但我觉得会报vector越界的错误 class Solution { public: bool IsPopOrder(vector<int> pushV,ve ...
 - 剑指offer - 栈的压入弹出序列 - JavaScript
		
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 ...
 - 剑指offer 栈的压入弹出 顺序
		
判断: 如果下一个弹出的数字刚好是栈顶元素,那么直接弹出 如果下一个弹出的数字不在栈顶,我们要把压栈序列中,还没有入栈的数字压入辅助栈,知道把下一个需要弹出的数字压入栈顶 如果所有的数字都入栈,但是仍 ...
 - C++版 - 剑指offer 面试题22:栈的压入、弹出序列 题解
		
剑指offer 面试题22:栈的压入.弹出序列 提交网址: http://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106?tpId ...
 
随机推荐
- Django 练习班级管理系统五 -- 查看老师列表
			
models.py 对应的配置 class Classes(models.Model): caption = models.CharField(max_length=32) class Teacher ...
 - linux 进程通信之 mmap
			
一,管道PIPE 二,FIFO通信 三,mmap通信 创建内存映射区. #include <sys/mman.h> void *mmap(void *addr, size_t length ...
 - [PHP] 使用ftell和fseek函数直接定位文件位置获取部分数据
			
对于大文件只获取部分数据很有用 1.使用ftell函数可以获取当前指针的字节位置2.使用fseek函数可以直接定位到指定的位置3.读取指定字节的数据就可以部分获取文件内容了 <?php clas ...
 - Highways POJ - 1751
			
题目链接:https://vjudge.net/problem/POJ-1751 思路: 最小生成树板子,只需要多记录每个dis[x]的权值是从哪个点到x这个点的. #include <stdi ...
 - Spring Junit 测试样例
			
SpringMVC 框架下的junit测试方式 package com.sixeco.user.controller; import org.apache.logging.log4j.LogManag ...
 - Mybatis-plus使用分页进行分页查询
			
首先先配置配置文件 @Configuration public class MybatisPlusConfig { @Bean public PaginationInterceptor paginat ...
 - 201871010101-陈来弟《面向对象程序设计(java)》第十六周学习总结
			
实验十四 应用程序归档与线程初步 实验时间 2019-12-12 第一部分:基础知识 1. 程序与进程: 进程是指一个具有一定独立功能的程序关于某个数据集合的一次运行活动.电脑中时会有很多单独运行的 ...
 - 【软件工程1916|W(福州大学)_助教博客】2019年上学期期末问卷调查结果公示
			
1.调查问卷概况 福州大学2019W班,收集到有效答卷44份 2. 调查问卷情况 Q1:请问你平均每周在课程上花费多少小时? 去除自估水平超过40小时的,平均16.6H Q2.软工实践的各次作业分别花 ...
 - C++双线性插值-片段
			
代码不能直接使用. for (int j = strRY; j<endRY; ++j) { float * pR = result.ptr<float>(j); for (int i ...
 - Ant下载与安装
			
1.登录http://ant.apache.org/bindownload.cgi 站点下载Ant最新版建议Windows平台下载*.zip压缩包 2.将下载到的压缩文件压缩到(G:software\ ...