面试题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
原创粉丝点击