算法培训 Day 1-1 验证栈序列
给出两个序列 表示入栈pushed 序列 和 可能出栈的序列poped
现在判断poped是否为可能的出栈序列
(这里可能入栈一部分 然后就出栈 然后再入栈 再出栈)
解答
这里需要用到一个栈 来模拟入栈顺序,然后用一个 指针ptr 指向poped序列,当入栈后的数据 的栈顶为ptr 指向的 poped 序列的数,则将其出栈,然后ptr后移 直到最后push进入所有数据 或者是栈为空
然后判断现在的栈情况
- 如果栈为空,则肯定是pushed 和 poped 相符合,因为只有top 和 ptr指向的poped相等 才会出栈,这样就是符合情况的
- 栈不空 则一定不符和
int ptr=0;
for(int j=0;j<n;j++)
{
s.push(pushed[j]);
while((s.top())==poped[ptr])
{
s.pop();
ptr++;
if(s.empty())
break;
}
}
if(s.empty())
printf("Yes\n");
else
printf("No\n");
下面是整道题目的源码
#include<bits/stdc++.h>
using namespace std;
int pushed[100000+10];
int poped[100000+10];
int main()
{
stack<int> s;
int q;
int n;
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
scanf("%d",&n);
fill(pushed,pushed+n,0);
fill(poped,poped+n,0);
for(int j=0;j<n;j++)
scanf("%d",&pushed[j]);
for(int j=0;j<n;j++)
scanf("%d",&poped[j]);
int ptr=0;
for(int j=0;j<n;j++)
{
s.push(pushed[j]);
while((s.top())==poped[ptr])
{
s.pop();
ptr++;
if(s.empty())
break;
}
}
if(s.empty())
printf("Yes\n");
else
printf("No\n");
while(!s.empty())
s.pop();
}
return 0;
}