题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
算法思想
将第一个序列数据先压栈,如果最上面的数据与第二个需要弹出的数据相同,进行判断下一个栈顶数据是否为需要弹出的数据,如果是继续进行这样的判断,如果不是就跳出循环将第一个序列的数据压栈。
最终如果弹出数列全都遍历完了,说明是压栈序列的弹出序列。
算法实现
剑指offer算法实现:
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
int pushVsize = pushV.size();
stack<int> stacktemp;
int j = 0;
for(int i = 0; i < pushVsize; i++) {
stacktemp.push(pushV[i]);
while(stacktemp.top() == popV[j]) {
stacktemp.pop();
j++;
if(stacktemp.empty()) break;
}
}
return j==pushVsize;
}
};
带有测试用例的C++实现:
#include <stdc++.h>
using namespace std;
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
int pushVsize = pushV.size();
stack<int> stacktemp;
int j = 0;
for(int i = 0; i < pushVsize; i++) {
//先将数据压入栈
stacktemp.push(pushV[i]);
//如果栈中的最上面的数据需要弹出
while(stacktemp.top() == popV[j]) {
//打印弹出的数据
cout << stacktemp.top();
//确定需要弹出后,将数据弹出并将pop数组后移
stacktemp.pop();
j++;
//如果栈为空肯定就没有数据需要打印并弹出了,break
if(stacktemp.empty()) break;
}
}
//最终pop序列下标j走完最后一个数据了,即表明成功
return j == pushVsize;
}
};
int main()
{
int a[] = {1,2,3,4,5};
vector<int> pushV(a, a+5);
int b[] = {4,5,3,2,1};
vector<int> popV(b, b+5);
Solution S;
if(S.IsPopOrder(pushV, popV))
cout << endl << "True" << endl;
else
cout << endl << "Flase" << endl;
cout << "Hello world!" << endl;
return 0;
}
运行截图
总结
对向量的初始化这里用的是数组先初始化然后赋值给向量:
int a[] = {1,2,3,4,5};
vector<int> pushV(a, a+5);
int b[] = {4,5,3,2,1};
vector<int> popV(b, b+5);