题目:输入两个整数序列,第一个序列表示栈的压入序列,请判断第二个序列是否为弹出序列。

思路:定义两个指针sPush和sPop分别指向两个整数序列的开头,借助一个辅助的栈,将第一个序列的数据依次压入栈中,直到压入栈中的数据和第二个栈中sPop所指向的数据相等,就将这个数据弹出栈。sPop指向下一个数字。重复上述过程。直到sPop等于序列的长度并且栈为空。

将抽象的问题具体化的过程如下:

C++代码:

#include<iostream>
#include<stack> bool isPopOrder(const int* sPush,const int* sPop,int nLength)
{
bool isPopOrder=false;
if(sPush!=NULL&&sPop!=NULL&&nLength>)
{
const int* pNextPush=sPush;
const int* pNextPop=sPop;
std::stack<int> stack;
while(pNextPop-sPop<nLength)
{
while(stack.empty()||*pNextPop!=stack.top())
{
if(pNextPush-sPush==nLength)
break;
stack.push(*pNextPush);
pNextPush++;
}
if(stack.top()!=*pNextPop)
break;
stack.pop();
pNextPop++; }
if(stack.empty()&&pNextPop-sPop==nLength)
isPopOrder=true;
}
return isPopOrder;
}
void test(const int* a,const int * b)
{
if(isPopOrder(a,b,))
printf("b是a的弹出序列\n");
else
printf("b不是a的弹出序列\n");
}
void main()
{
int a[]={,,,,};
int b[]={,,,,};
int c[]={,,,,};
test(a,b);
test(a,c); }

Java代码:

import java.util.Stack;
public class IsPopOrder {
public boolean isPopOrder(int[] sPush,int[] sPop,int length){
boolean isPop=false;
int sNextPush=;
int sNextPop=;
Stack<Integer> stack=new Stack<Integer>();
if(sPush!=null||sPop!=null||length>){
while(sNextPop<length){
while(stack.empty()||stack.peek()!=sPop[sNextPop])
{
if(sNextPush==length)
break;
stack.push(sPush[sNextPush]);
sNextPush++;
}
if((int)stack.peek()!=sPop[sNextPop])
break;
stack.pop();
sNextPop++;
}
if(stack.isEmpty()&&sNextPop==length){
isPop=true;
}
}
return isPop;
}
public static void main(String[] args)
{
int[] a={,,,,};
int[] b={,,,,};
int[] c={,,,,};
IsPopOrder ipo=new IsPopOrder();
if(ipo.isPopOrder(a, c, a.length))
System.out.print("true");
else
System.out.print("false");
}
}

剑指offer-第四章解决面试题的思路(栈的压入和弹出序列)的更多相关文章

  1. C++版 - 剑指offer 面试题22:栈的压入、弹出序列 题解

    剑指offer 面试题22:栈的压入.弹出序列 提交网址: http://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106?tpId ...

  2. 剑指Offer面试题:20.栈的压入、弹出序列

    一.题目:栈的压入.弹出序列 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1.2.3.4.5是某栈的压栈序列,序列4 ...

  3. (剑指Offer)面试题22:栈的压入、弹出序列

    题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等. 例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...

  4. 【剑指offer 面试题22】栈的压入、弹出序列

    思路: 不停地压栈,直到栈头元素与弹出序列的首元素相等则出栈,同时弹出序列后移:若不相等则一直保持压栈,直到压入所有元素后弹出序列仍不为空,则说明无法匹配. C++: #include <ios ...

  5. 【剑指offer】面试题22:栈的压入、弹出序列

    题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列 ...

  6. 【剑指Offer学习】【面试题22:栈的压入、弹出序列】

    题目:输入两个整数序列,第一个序列表示栈的压入顺序,请推断二个序列是否为该栈的弹出顺序.假设压入栈的全部数字均不相等. 解题思路: 解决问题非常直观的想法就是建立一个辅助栈.把输入的第一个序列中的数字 ...

  7. 剑指Offer - 九度1366 - 栈的压入、弹出序列

    剑指Offer - 九度1366 - 栈的压入.弹出序列2014-02-05 20:41 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所 ...

  8. 剑指Offer:栈的压入、弹出序列【31】

    剑指Offer:栈的压入.弹出序列[31] 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈 ...

  9. 剑指Offer(二十一):栈的压入、弹出序列

    剑指Offer(二十一):栈的压入.弹出序列 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...

  10. 剑指 Offer 31. 栈的压入、弹出序列 + 入栈顺序和出栈顺序的匹配问题

    剑指 Offer 31. 栈的压入.弹出序列 Offer_31 题目详情: 解析: 这里需要使用一个栈来模仿入栈操作. package com.walegarrett.offer; /** * @Au ...

随机推荐

  1. 通过自动回复机器人学Mybatis:代码重构(分层)

    imooc视频学习笔记 ----> URL:http://www.imooc.com/learn/154 ListServlet.java package com.imooc.servlet; ...

  2. jQuery上下切换带缩略图的焦点图

    在线演示 本地下载

  3. 20145201 《Java程序设计》第四周学习总结

    20145201 <Java程序设计>第四周学习总结 教材学习内容总结 本周学习了课本第六.七章内容,即继承与多态.接口与多态. 第六章 继承与多态 6.1 何谓继承 6.1.1 继承共同 ...

  4. Spring 模块

  5. Spring核心技术AOP实现原理

    关于Spring的AOP也是Spring的非常重要的一项技术.大致上可以这样说,面向切面编程,它的出现说明可以在不修改代码的情况下实现对功能的增强.而增强就是给一个方法增加一些功能.AOP主要思想就是 ...

  6. E - Water Distribution

    E - Water Distribution 题目大意: 有\(N\)座城市,给定这\(N\)座城市的坐标和初始的水量\(x_i,y_i,a_i\),在两个城市之间运水的花费是两个城市的欧几里得距离. ...

  7. gcm 被微信弃用的原因

    作者:feng xixi链接:https://www.zhihu.com/question/21514839/answer/18496706来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商 ...

  8. 简单Trace类实现

    <C++沉思录>27章内容修改后所得: /************************************************************************/ ...

  9. IOS-Alcatraz(插件管理工具)

    一.简单说明 Alcatraz 是一款 Xcode的插件管理工具,可以用来管理XCode的 插件.模版以及颜色配置的工具. 二.如何安装 1.github地址:https://github.com/a ...

  10. urllib.urlretrieve远程下载

    下面我们再来看看 urllib 模块提供的 urlretrieve() 函数.urlretrieve() 方法直接将远程数据下载到本地. >>> help(urllib.urlret ...