剑指Offer面试题:20.栈的压入、弹出序列
一、题目:栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。

二、解题思路
2.1 核心步骤

正确的弹出序列

不正确的弹出序列
通过分析以上序列,可以得出:
- 如果下一个弹出的数字刚好是栈顶数字,那么直接弹出。
- 如果下一个弹出的数字不在栈顶,我们把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶为止。
- 如果所有的数字都压入栈了仍然没有找到下一个弹出的数字,那么该序列不可能是一个弹出序列。
2.2 代码实现
public static bool IsPopOrder(int[] pushOrder, int[] popOrder, int length)
{
bool possible = false; if (pushOrder != null && popOrder != null && length > )
{
int nextPush = ; // 指向下一个要push的元素的index
int nextPop = ; // 指向下一个要pop的元素的index
int pop = ; // 指向popOrder的首个元素的index
int push = ; // 指向pushOrder的首个元素的index Stack<int> stackData = new Stack<int>();
while (nextPop - pop < length)
{
// 当辅助栈的栈顶元素不是要弹出的元素
// 先压入一些数字入栈
while (stackData.Count == || stackData.Peek() != popOrder[nextPop])
{
// 如果所有数字都压入辅助栈了,退出循环
if (nextPush - push == length)
{
break;
} stackData.Push(pushOrder[nextPush]);
nextPush++;
} // 说明没有匹配成功
if (stackData.Peek() != popOrder[nextPop])
{
break;
} stackData.Pop();
nextPop++;
} if (stackData.Count == && nextPop - pop == length)
{
possible = true;
}
} return possible;
}
三、单元测试
3.1 功能测试
[TestMethod]
public void OrderTest1()
{
int length = ;
int[] push = { , , , , };
int[] pop = { , , , , }; Assert.AreEqual(StackHelper.IsPopOrder(push, pop, length), true);
} [TestMethod]
public void OrderTest2()
{
int length = ;
int[] push = { , , , , };
int[] pop = { , , , , }; Assert.AreEqual(StackHelper.IsPopOrder(push, pop, length), true);
} [TestMethod]
public void OrderTest3()
{
int length = ;
int[] push = { , , , , };
int[] pop = { , , , , }; Assert.AreEqual(StackHelper.IsPopOrder(push, pop, length), false);
} [TestMethod]
public void OrderTest4()
{
int length = ;
int[] push = { , , , , };
int[] pop = { , , , , }; Assert.AreEqual(StackHelper.IsPopOrder(push, pop, length), false);
}
3.2 特殊输入测试
// push和pop序列只有一个数字且不同
[TestMethod]
public void OrderTest5()
{
int length = ;
int[] push = { };
int[] pop = { }; Assert.AreEqual(StackHelper.IsPopOrder(push, pop, length), false);
} // push和pop序列只有一个数字且相同
[TestMethod]
public void OrderTest6()
{
int length = ;
int[] push = { };
int[] pop = { }; Assert.AreEqual(StackHelper.IsPopOrder(push, pop, length), true);
} // NULL指针
[TestMethod]
public void OrderTest7()
{
Assert.AreEqual(StackHelper.IsPopOrder(null, null, ), false);
}
3.3 测试结果
(1)测试通过情况

(2)代码覆盖率

剑指Offer面试题:20.栈的压入、弹出序列的更多相关文章
- 剑指Offer:面试题22——栈的压入,弹出序列(java实现)
题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...
- 剑指 offer面试题22 栈的压入和弹出序列
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...
- 剑指offer-面试题22.栈的压入,弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第 二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等. 例如序列1.2.3.4.5是某栈的压栈序列,序列4.5.3.2.1 是该压栈 ...
- 剑指Offer - 九度1366 - 栈的压入、弹出序列
剑指Offer - 九度1366 - 栈的压入.弹出序列2014-02-05 20:41 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所 ...
- 剑指offer(21)栈的压入、弹出序列
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...
- 剑指offer二十一之栈的压入、弹出序列
一.题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...
- 【剑指offer】栈的压入弹出序列,C++实现(举例)
原创文章,转载请注明出处! 本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 1.题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为第一个序列的出栈序列.注意 ...
- 【剑指Offer】21、栈的压入、弹出序列
题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2 ...
- 剑指offer 22:验证栈的压入、弹出序列
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...
- 剑指offer - 栈的压入弹出序列 - JavaScript
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 ...
随机推荐
- C++ 系列:C++ 对象模型
1 何为C++对象模型 C++对象模型可以概括为以下2部分: 1.语言中直接支持面向对象程序设计的部分: 2.对于各种支持的底层实现机制 语言中直接支持面向对象程序设计的部分,如构造函数.析 ...
- asp.net(C#)读取文件夹和子文件夹下所有文件,绑定到GRIDVIEW并排序 .
Asp部分: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MyFiles ...
- 【BO】SAP BO相关问题汇总贴
本文将以往写过的关于SAP BO相关问题的帖子汇总了一下,方便寻找 #1 为WEBI报表添加自定义字体font #2 WEBI文件打开时提示Illegal access错误 #3 安装BO服务器时,o ...
- 51nod 1712 区间求和
题意 给你一个长度为 \(n\) 的序列,定义这个序列的权值为 $ \sum_{1 \leq i<j \leq n} a_j - a_i $. 现在给你一个长度为 \(n\) 的序列,当$ a_ ...
- PHP多级联动的学习(一)
我尝试在ThinkCMF中实现多级联动,首先我开始看了dede的联动类别管理前后台的代码以及他的数据库,经过非常多次的尝试,我渐渐有了一点想法,并给予实施. 首先写出前台的界面.如图. 然后在数据库中 ...
- e.preventDefault() e.stopPropagation()和return false的区别
e.preventDefault(); //阻止事件的默认行为,比如a标签的转向,但不阻止事件的冒泡传播e.stopPropagation() //阻止事件的冒泡传播,但不阻止其默认行为returne ...
- smack 4.1创建群聊
smack 4.1.1版本对群聊修改了很多,MultUserChat的构造函数修改成了私有,以前通过new MultUserChat创建聊天室,现在通过MultUserChatMananger先通过r ...
- Ubuntu安装Oracle SQLDeveloper
1、下载Oracle安装文件 这里我下载的是Linux RPM版本,文件名为sqldeveloper-4.0.3.16.84-1.noarch.rpm http://www.oracle.com/te ...
- linux进程后台运行及输出重定向
本机环境为ubuntu 14.04 以ping www.baidu.com为例: 1.程序的前台运行 ping www.baidu.com 可以看到,屏幕上输出了baidu返回的结果 2.实现程序后台 ...
- C#委托与事件初探
最近刚刚接触C#,学到事件与委托部分无法理解,于是上网查阅了各种资料,终于明白了一些,在此进行总结. 一.C语言中的函数指针 想要理解什么是委托,就要先理解函数指针的概念.所谓函数指针,就是指向函数的 ...