面试题26:栈的压入、弹出序列
来源:互联网 发布:大数据培训视频 编辑:程序博客网 时间:2024/05/29 18:56
题目:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的可能弹出顺序。假设压入栈的所有数字均不相同。
边界条件:
有一个序列为空,两个序列不相等。
思路:
假设序列A是1,2,3,4,5,序列B是4,5,3,2,1
第一步,我们定义一个栈,用来将A中数字压入栈;
第二步,取B得第一个元素b1=4,和A 的第一个元素a1=1,a1和b1不相等,于是我们将a1压入战中;
第三步,区A中下一个数字a2=2,a2和b1不相等,于是将a2压入栈中;
...
第五步,取A中下一个数字a4=4,a4和b4相等,于是取B的下一个元素b2=5;
第六步,判断b2是否和栈顶元素相等,如果相等,则出栈,且B取下一个元素,如果不相等,则下一步;
第七步,取A下一个元素a5=5,判断是否和b2相等,若不相等,则返回假;若相等,则取下一个元素,如果是最后一个元素,则出栈一个元素,和b2的下一个元素比较。
如果有不相等,返回假,一直到B的最后一个元素和栈的最后一个元素比较,如果都相等,则返回真。
时间复杂度:O(n)
#include <iostream> #include <vector> #include <string> #include <stack> #include <algorithm> using namespace std;bool IsInAndOutStack(vector<int> A, vector<int> B){int size1 = A.size(), size2 = B.size();if (size1 != size2) return false;if (size1 == 0) return true;stack<int> testStack;int indexA = 0, indexB = 0;while (indexB < size2){if (indexA<size1 && A[indexA] == B[indexB]){++indexA;++indexB;}else if (testStack.size() > 0 && testStack.top() == B[indexB]){++indexB;testStack.pop();}else if (indexA < size1 && A[indexA] != B[indexB]){testStack.push(A[indexA]);++indexA;}elsereturn false;}return true;}int main(){int arr1[] = { 1, 2, 3, 4, 5 };int arr2[] = { 5, 4, 3, 2, 1 };vector<int> nums1(arr1, arr1 + 5);vector<int> nums2(arr2, arr2 + 5);cout<<IsInAndOutStack(nums1,nums2)<<endl;return 0;}
0 0
- 面试题26:栈的压入、弹出序列
- 面试题20:栈的压入、弹出序列
- 【面试题二十二】栈的压入、弹出序列
- 面试题整理6 栈的压入、弹出序列
- 栈的压入、弹出序列(面试题 22)
- 面试题22:栈的压入弹出序列
- 面试题22栈的压入、弹出序列
- 面试题22 栈的压入弹出序列
- 面试题22:栈的压入弹出序列
- 面试题22:栈的压入、弹出序列
- 【经典面试题】栈的压入弹出序列
- 栈的压入、弹出序列(剑指offer面试题)
- 剑指offer面试题 栈的压入、弹出序列
- 面试题22:栈的压入、弹出序列
- 面试题22 栈的压入、弹出序列
- 面试题22:栈的压入、弹出序列
- 面试题22:栈的压入、弹出序列
- 面试题22栈的压入弹出序列
- 记录最近的站长生活
- 动态添加组件
- Android中ExpandableListView的使用
- 哲学家问题 pthread信号量实现
- JSON介绍
- 面试题26:栈的压入、弹出序列
- Hive编程指南--管理表和外部表
- ubuntu 编译hadoop
- nginx总结
- 【LEETCODE】88-Merge Sorted Array
- School idol project
- Gradle Plugin Samples (一)
- mongodb的增删查改等常用操作
- QT学习之类型转换,char*,QString,int,QByteArray之间的转换。