牛客网剑指offer第21题——判断出栈序列是否是入栈序列
题目:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
先上通过的代码:
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
bool isoder = false;
int i = ;
int j = ;
stack<int> pushs;
if(pushV.size()&& popV.size())
{
while(i < pushV.size())
{
while((pushs.empty())||(j<popV.size()) && (pushs.top() != popV[j]) )
{
pushs.push(pushV[i]);
i++;
}
while((!pushs.empty())&& (j<popV.size())&& (pushs.top() == popV[j]))
{
pushs.pop();
j++;
}
}
if(pushs.empty())
isoder = true;
}
return isoder;
}
};
尽管这道题还有其他最为简单的办法,但是这里,我们不讲究任何技巧,介绍一种最为朴素的思想:
如果给出的序列是一种入栈数组的出栈序列,那么我们将这个数组数组入栈,并且按照某种规则出栈,那么最终会得到一个和给出序列一样的序列,并且这个栈最终会变成空栈!而我们判断这个序列是否是给出数组的一种出栈可能,就是看我们模拟出来的这个栈是否最终会变成一个空栈。
下面,我们探讨,上述提到的所谓出栈规则究竟是什么?
如果要验证所给的序列确实是入栈数组的出栈序列,我们应该做的就是:尽量对入栈序列按照给定的出栈方式出栈,如果最后全部元素出栈,即栈空,则表明所给出栈序列是正确的。下面我们具体的举例说明:
假设提供的是入栈序列是1、2、3、4、5;提供的出栈序列是 4 3 5 1 2;如何验证这个序列是否正确呢?
核心思路即上述所说:使得入栈序列的出栈方式尽量向所给出栈序列靠拢。下面我们来描述一下完整的思路:
假设提供的入栈顺序是:、、、、 push() -> stack.top() = ≠,继续push push() -> stack.top() = ≠,继续push push() -> stack.top() = ≠,继续push push() -> stack.top() = =,pop(),出栈索引+,此时指向了3 stack.top = = ,pop(),出栈索引+,此时指向了5。 stack.top = ≠,继续push push() ->stack.top = = ,pop(),出栈索引+,此时指向了2 stack.top = = ,pop(),出栈索引+,此时指向了1。 stack.top = = ,pop(),出栈索引+,此时指向了空。 **此时stack为空!!!,因此4、、、、1是1、、、、5的一个出栈序列**
上文已经给出类似于判决思路:模拟序列的入栈出栈过程,使其出栈向所给序列靠拢,若最后所有元素成功出栈,即栈空,表明所给序列是正确的。
下面针对上述代码,我们说明STL中栈stack的一一些函数。
push(x),将元素x入栈 pop(),将栈顶元素出栈,但是并不返回栈顶元素(返回类型为void) top(),返回栈顶元素,但是不删除栈顶元素(不执行pop功能),**若栈为空,执行top()返回-** empty(),判断栈是否为空,**为空返回1,不空返回0**
其他函数以后遇到再说:
此题的延伸题目:给出一个入栈序列,求所有的出栈序列?(思考怎么做)
给出一个长度为n的序列,其所有的出栈可能数为:卡塔兰数

牛客网剑指offer第21题——判断出栈序列是否是入栈序列的更多相关文章
- 牛客网剑指offer第13题——调整数组顺序使得奇数位于偶数前面
题目来源:剑指offer 题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变 ...
- 牛客网剑指offer第19题——顺时针打印矩阵
这个题看似很简单: 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 ...
- 牛客网剑指offer第34题——找到第一个只出现一次的字符
题目如下: 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 先上代码: class ...
- 数据流中的中位数 牛客网 剑指Offer
数据流中的中位数 牛客网 剑指Offer 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就 ...
- 数字在排序数组中出现的次数 牛客网 剑指Offer
数字在排序数组中出现的次数 牛客网 剑指Offer 题目描述 统计一个数字在排序数组中出现的次数. class Solution: def GetNumberOfK(self, data, k): i ...
- 矩形覆盖 牛客网 剑指Offer
矩形覆盖 牛客网 剑指Offer 题目描述 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形.请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? class Solution: ...
- 数组中只出现过一次的数字 牛客网 剑指Offer
数组中只出现过一次的数字 牛客网 剑指Offer 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次.请写程序找出这两个只出现一次的数字. def FindNumsAppearOnce ...
- 数组中出现次数超过一半的数字 牛客网 剑指Offer
数组中出现次数超过一半的数字 牛客网 剑指Offer 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字 ...
- 数值的整数次方 牛客网 剑指Offer
数值的整数次方 牛客网 剑指Offer 题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方 class Solution: #run ...
随机推荐
- linux查看显卡
查看 nvidia 显卡 $ lspci | grep -i nvidia 02:00.0 3D controller: nVidia Corporation Device 1023 (rev a1) ...
- Python语言学习:homework1
'''购物车程序1.启动程序后,让用户输入工资,然后打印商品列表2.允许用户根据商品编号购买商品3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒4.可随时退出,退出时,打印已购买商品和余额 ...
- Java操作redis客户端Jedis连接集群(Cluster)
创建JedisCluster类连接redis集群. @Test public void testJedisCluster() throws Exception { //创建一连接,JedisClust ...
- linux中的文件解压命令
http://apps.hi.baidu.com/share/detail/37384818 download ADT link http://dl.google.com/android/ADT-0. ...
- bind() 方法
一. 定义和用法 bind() 方法为被选元素添加一个或多个事件处理程序,并规定事件发生时运行的函数. 语法: $(selector).bind(event,data,function) 举例:
- linux上安装 mysql
一.linux 上安装 mysql 1.查看mysql是否安装 rpm -qa|grep mysql 2.卸载 mysql yum remove mysql mysql-server mysql-li ...
- linux 上安装 java
一.源码安装 1.本地下载 java, 并上传到 linux 上 2.解压文件 tar -zxvf jdk-7u72-linux-i586.gz 3.配置环境变量 vi /etc/profile ...
- Rx系列---响应式编程
Rx是ReactiveX的简称,翻译过来就是响应式编程 首先要先理清这么一个问题:Rxjava和我们平时写的程序有什么不同.相信稍微对Rxjava有点认知的朋友都会深深感受到用这种方式写的程序和我们一 ...
- [LC] 404. Sum of Left Leaves
Find the sum of all left leaves in a given binary tree. Example: 3 / \ 9 20 / \ 15 7 There are two l ...
- 基于Python的Flask基础知识
Flask简介 Flask 是一个使用 Python 编写的轻量级 Web 应用程序框架.Armin Ronacher带领一个名为Pocco的国际Python爱好者团队开发了Flask. 下面我们简单 ...