The_Dog_of_Hoshiguma @ 2022-08-18 23:37:56
本人认为下面两个代码是相同的……有dalao能举出反例证明这两个代码为什么不同吗……
第一个AC
#include<iostream>
#include<stack>
using namespace std;
stack<int> p;
int a[3000001],b[3000001];
int main()
{
int n,q;
cin>>q;
while(q--)
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
cin>>b[i];
}
int tot=1;
for(int i=1;i<=n;i++)
{
p.push(a[i]);
while(p.top()==b[tot])
{
tot++;
p.pop();
if(p.empty())
{
break;
}
}
}
if(p.empty())
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
while(!p.empty())
{
p.pop();
}
}
return 0;
}
第二个RE
#include<iostream>
#include<stack>
using namespace std;
stack<int> p;
int a[3000001],b[3000001];
int main()
{
int n,q;
cin>>q;
while(q--)
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
cin>>b[i];
}
int tot=1;
for(int i=1;i<=n;i++)
{
p.push(a[i]);
while(p.top()==b[tot]&&(!p.empty()))
{
tot++;
p.pop();
}
}
if(p.empty())
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
while(!p.empty())
{
p.pop();
}
}
return 0;
}
唯一的差别就在于这个地方的差异
while(p.top()==b[tot]&&(!p.empty()))
{
tot++;
p.pop();
}
while(p.top()==b[tot])
{
tot++;
p.pop();
if(p.empty())
{
break;
}
}
by xzy090626 @ 2022-08-18 23:44:40
@蝶澈_璃裳 万一这个栈一开始就空了呢?
by _zexal_ @ 2022-08-18 23:54:04
@蝶澈_璃裳 if优先级问题,他会按循序执行你的判断,所以他会先用栈顶,如果此时栈是空的,就会RE,判断空再看栈顶之前就好了。