牛客网剑指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 ...
随机推荐
- maven仓库镜像、私服与jdk版本配置
--配置全局镜像,setting.xml <mirrors> <mirror> <id>alimaven</id> <name>aliyun ...
- metinfo_5.3变量覆盖引发的一系列问题
metinfo_5.3中存在一个很经典的$$型变量覆盖,这种变量覆盖在之前的博客中提到过,今天的博客围绕这个变量覆盖漏洞结合这款CMS的其他功能进行漏洞利用. 变量覆盖+文件包含 拿到这个CMS首先还 ...
- \b 是单词边界锚点 word-boundary anchor,一个“\b”匹配一个单词的一端,两个“\b”匹配一个单词的头尾两端
123 $_ = "beforematcha? fter"; 124 if(/\b\w+a\b/){ 125 print "matched: < ...
- Perl: 单引号里面的直接给当做标量了,而直接输出($`)的话就是变量值,即相符段落的前置字符会存到这里。输出‘$`’ 就变成标量值了
print '$`'."\n";print '$&'."\n";print $'."\n"; 输出: $`$& 而直接输出( ...
- 十六、linux系统网络基础
1.网络是由IP构成的:network + host,以至于我们使用网络向外发信息,不会发错. 2.子网掩码这里要知道两点: 1)子网掩码不可能出现交叉部分,换句话说不会出现01010101的交叉现象 ...
- iOS UICollectionViewCell 的拖动
1.长按cell的情况下实现拖动,所以理应想到用长按手势. 2.既然实现移动cell,就要看看UICollectionView 有没有方法或者协议可以移动的.通过查看UICollectionView的 ...
- Learn Git Lesson06 - 分离头指针
============== 知识点 分离头指针 HEAD 含义 git diff 分离头指针 (Detached HEAD) 有时候想尝试性修改某些内容(实验),也许并不会真的提交到分支,这时候可以 ...
- Django使用DjangoUeditor教程
文章目录 1.将下在DjangoUeditor解压2.将解压的文件夹复制到项目的根目录中,这里使用的是虚拟环境3.进入到DjangoUedior3-master文件下,执行离线安装命令 python ...
- 规范化开发和time相关模块
1. 规范化开发 如果在开发的过程中将所有的程序放在一个py文件中,加载时会很慢,同时降低了代码的可读性,查询起来也麻烦 所以要将一个oy文件合理的分成多个py文件,在blog大目录下分为以下几个部分 ...
- [LC] 54. Spiral Matrix
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...