剑指Offer_栈的压入序列是否有对应的弹出序列
题目:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。
如:假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列。
但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
解题思路:
建一个临时栈,将输入序列pushA[]的数据依次往栈中压,每进一个都跟popA[]中第一个位置的数比较,
若相同,则弹出,然后继续压入,同时跟popA[]第二个位置的数比较,若相同,则弹出,下一个压入的数和popA[]第三个位置的数比较,
依次进行下去,若到最后,临时栈内的数都能弹出,则说明,该popA[]是pushA[]的一个弹出序列,文字描述比较空洞,下面详细列举每个步骤的结果:
设有栈 Stack<Integer> temp = new Stack<Integer>(); 弹出序列的下标int popIndex = 0;
pushA[] = {1,2,3,4,5};popA[] = {4,5,3,2,1};
(1)1压入,与 popA[popIndex]比较,1!=4;不弹出,继续压入;
(2)2压入,与 popA[popIndex]比较,2!=4;不弹出,继续压入;
(3)3压入,与 popA[popIndex]比较,3!=4;不弹出,继续压入;
(4)4压入,与 popA[popIndex]比较,4==4;4弹出,popIndex 后移一位,popIndex = popIndex + 1 = 1;
(5)5压入,与 popA[popIndex]比较,5==5;5弹出,popIndex 后移一位,popIndex = popIndex + 1 = 2; //五个数都依次进了栈
(6)5弹出后,栈顶元素为3,3与 popA[popIndex]比较,3==3;3弹出,popIndex 后移一位,popIndex = popIndex + 1 = 3;
(7)3弹出后,栈顶元素为2,2与 popA[popIndex]比较,2==2;2弹出,popIndex 后移一位,popIndex = popIndex + 1 = 4;
(8)2弹出后,栈顶元素为1,1与 popA[popIndex]比较,1==1;1弹出,popIndex 后移一位,popIndex = popIndex + 1 = 5;
至此,临时栈内所有元素都弹出了,栈为空,则表明pupA[]是popA[]的一个弹出序列;
若popA [] = {4,5,3,1,2}; 则情况为:
(1)1压入,与 popA[popIndex]比较,1!=4;不弹出,继续压入;
(2)2压入,与 popA[popIndex]比较,2!=4;不弹出,继续压入;
(3)3压入,与 popA[popIndex]比较,3!=4;不弹出,继续压入;
(4)4压入,与 popA[popIndex]比较,4==4;4弹出,popIndex 后移一位,popIndex = popIndex + 1 = 1;
(5)5压入,与 popA[popIndex]比较,5==5;5弹出,popIndex 后移一位,popIndex = popIndex + 1 = 2; //五个数都依次进了栈
(6)5弹出后,栈顶元素为3,3与 popA[popIndex]比较,3==3;3弹出,popIndex 后移一位,popIndex = popIndex + 1 = 3;
(7)3弹出后,栈顶元素为2,2与 popA[popIndex]比较,2!=1;2不弹出;2一直都不能弹出,所以该栈一直处于有数据的状态,则popA[]不是pushA[]的弹出序列;
代码实现(Java):
/**
*
*/
package com.cherish.SwordRefersToOffer; import java.util.Stack; /**
* @author acer
*题目:
*输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。
*假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列
*,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
*
*
*/
public class test_31_栈的压入和弹出序列 { /**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
int[] pushA = {1,2,3,4,5};
int[] popA = {4,5,3,2,1};
System.out.println(IsPopOrder(pushA,popA));
} public static boolean IsPopOrder(int [] pushA,int [] popA) {
if(pushA.length == 0||popA.length == 0)
{
return false;
}
Stack<Integer> temp = new Stack<Integer>();
//用于标识弹出序列的位置
int popIndex = 0;
for(int i = 0;i<pushA.length;i++)
{
temp.push(pushA[i]);
//如果栈不为空,且栈顶元素等于弹出序列
while(!temp.empty()&&temp.peek() == popA[popIndex])
{
//出栈
temp.pop();
//弹出序列向后一位
popIndex++;
}
}
return temp.empty();
} }
运行结果:

代码实现(C#):
using System;
using System.Collections.Generic;
using System.Linq; namespace test_31_栈的压入和弹出序列
{
class Program
{
static void Main(string[] args)
{
int[] pushV = { , , , , };
int[] popV = { , , , , }; Console.WriteLine(IsPopOrder(pushV,popV));
Console.ReadLine();
} public static bool IsPopOrder(int[] pushV, int[] popV)
{
// write code here
if (pushV.Length == || popV.Length == )
{
return false;
}
var stack = new Stack<int>();
int popIndex = ;
for (int i = ; i < pushV.Length; i++)
{
stack.Push(pushV[i]);
while (stack.Count > && stack.Peek().Equals(popV[popIndex]))
{
stack.Pop();//弹出栈顶元素
popIndex++;//popV下标后移一位
}
}
return stack.Count() == ; }
}
}
实现结果:

剑指Offer_栈的压入序列是否有对应的弹出序列的更多相关文章
- 用js刷剑指offer(栈的压入、弹出序列)
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...
- 剑指Offer 栈的压入、弹出序列
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...
- 剑指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是该压栈 ...
- 剑指offer - 栈的压入弹出序列 - JavaScript
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 ...
- 剑指offer 栈的压入弹出 顺序
判断: 如果下一个弹出的数字刚好是栈顶元素,那么直接弹出 如果下一个弹出的数字不在栈顶,我们要把压栈序列中,还没有入栈的数字压入辅助栈,知道把下一个需要弹出的数字压入栈顶 如果所有的数字都入栈,但是仍 ...
- 剑指offer 栈的压入和弹出
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...
- 剑指Offer20 栈的压入弹出序列是否正确
/************************************************************************* > File Name: 20_IsPopO ...
随机推荐
- 智能家居-2.基于esp8266的语音控制系统(硬件篇)
智能家居-1.基于esp8266的语音控制系统(开篇) 智能家居-2.基于esp8266的语音控制系统(硬件篇) 智能家居-3.基于esp8266的语音控制系统(软件篇) 赞赏支持 QQ:505645 ...
- 第3篇-超市管理系统Scrum冲刺博客
一.站立式会议: 1.会议照片 2.昨天完成的工作 ①数据库方面:根据需求关系为在数据库中建立相关表的基本模型供后续参考. ②前端方面:完成了登录界面的设计:各个界面的草图:为各个界面选取合适的图片如 ...
- [b0014] HDFS 常用JAVA 操作实战
目的: 学习用java进行的常用hdfs操作 参考: [b0002] Hadoop HDFS cmd常用命令练手 环境: hadoop2.6.4 win7 下的eclipse环境调试已经配置好,参考前 ...
- C++学习视频和资料
我在学习c++时,比较迷茫,而且当时学完c++primer时不知道该学习什么, 犹豫了好久,最后找到了一些关于c++学习路线的视频,包含源代码,我感觉还不错,分享给大家. 下载地址 https://d ...
- torchline:让Pytorch使用的更加顺滑
torchline地址:https://github.com/marsggbo/torchline 相信大家平时在使用Pytorch搭建网络时,多少还是会觉得繁琐,因为我们需要搭建数据读取,模型,训练 ...
- JS高阶---继承模式(借用构造函数继承+组合继承)
(1)借用构造函数继承 案例如下: 验证: (2)组合继承 案例如下: 验证如下: 结果如右图所示 . .
- 201871010107-公海瑜《面向对象程序设计(java)》第十五周学习总结
201871010107-公海瑜<面向对象程序设计(java)>第十五周学习总结 项目 内容 这个作业属于 ...
- django之三剑客、静态文件配置、请求响应对象、数据库操作
三剑客 from django.shortcuts import render,HttpResponse,redirect HttpResponse # 返回字符串 render(response, ...
- java第三讲课后动手动脑及代码编写
1. 类就是类型,对象就是这种类型的实例,也就是例子.类是抽象的东西,对象是某种类的实实在在的例子.例如:车是一个类,汽车,自行车就是他的对象. 对象的定义方法? (1)对象声明:类名 对象名: (2 ...
- Excel-数据透视表
例如: 购买数量采用求和的方式 用户数ID数据采用计数的方式 一.数据透视表的结构 二.数据透视表的步骤 1.订单表 提出问题,理解数据,数据清晰,构建模型,数据可视化 问题1:每个客户的订单量? 问 ...