栈应用-栈混洗
问题描述
给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。
输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
输出:false
解释:1 不能在 2 之前弹出。
思路
思路一
将要检测的pushed和poped模拟成一个向量,从而模拟混洗过程,当poped中的元素等于s中的元素,就进行s.pop()
,当pushed中所有元素压入完毕,如果s中为空,则证明true,反之为false
思路二
如果pushed和poped为一个栈,就不能随机访问,所以要将poped反向移到新创建的rpoped,这样rpoped中的访问顺序就为poped中的进入顺序,接下来的思路同思路一
代码实现
版本一
#include <iostream>
#include <stack>
#include <string>
#include <vector>
using namespace std;
bool validateStackSequences(vector<int> pushed, vector<int> poped)
{
stack<int> s;
int count = 0;
for (int i = 0; i < pushed.size(); i++)
{
s.push(pushed[i]);
while (!s.empty() && s.top() == poped[count])//有哨兵时,一定要注意数组越界
{
s.pop();
count++;
}
}
return s.empty();
}
int main()
{
vector<int> v1;
vector<int> v2;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
v2.push_back(3);
v2.push_back(2);
v2.push_back(4);
v2.push_back(1);
if (validateStackSequences(v1, v2))
{
cout << "true" << endl;
}
else
{
cout << "false" << endl;
}
system("pause");
return 0;
}
运行结果:
版本二
#include <iostream>
#include <stack>
#include <string>
using namespace std;
bool validateStackSequences(stack<int> pushed, stack<int> poped)
{
stack<int> s, rpoped;
while (poped.size())
{
rpoped.push(poped.top());
poped.pop();
}
while(pushed.size())
{
s.push(pushed.top());
pushed.pop();
while (s.size() && s.top() == rpoped.top())
{
s.pop();
rpoped.pop();
}
}
return s.empty();
}
int main()
{
stack<int> pushed, poped;
pushed.push(4);
pushed.push(3);
pushed.push(2);
pushed.push(1);
poped.push(3);
poped.push(2);
poped.push(4);
poped.push(1);
if (validateStackSequences(pushed, poped))
{
cout << "true" << endl;
}
else
{
cout << "false" << endl;
}
system("pause");
return 0;
}
运行结果: