数据结构之栈的应用
发布时间: 2018年4月2日 20:47 时间限制: 1000ms 内存限制: 128M
对于每一位学计算机的孩纸来说,数据结构(Data Structure)无疑是一门很重要的课程,对于做ACM的fudq来说,学好数据结构那可是重中之重啊~
某天,fudq坐火车去旅行,途径火车站,看到火车进站出站,突然回想起当年Professor Li教授的数据结构里栈的应用,还有那充满激情的“抽签助手”……
什么是“栈”呢,很多人马上会想到后进先出(Last In First Out)吧~
根据百度百科解释:
栈是只能在某一端插入和删除的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个进栈的数据被第一个读出来)
于是fudq想到了Professor Li曾经为了加深同学们对栈的理解,所提出的一个问题:
给出两个字符串s1和s2,请判断s1能否通过栈的模拟(即进栈和出栈)得到s2?
是不是很easy,那就快快AC吧~
输入有多组测试数据,每组输入占两行,s1和s2各占一行。为了简化问题,s1和s2保证仅由小写字母组成,不会出现其它字符;s1和s2等长,且长度不大于100;s2是s1的一种排列,不会在s2中出现s1里没有的字符。
对于每组输入,输出仅占一行,如果s1能通过栈的模拟得到s2,则输出“YES”;否则输出“NO”。
abcde baedc bjfuacm fujcbma
YES NO
———————————————————————————————————————————————————
感觉上这个题就是十分经典的火车入栈问题~
但是为啥就是A不了呢.....................Runtime error
#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
int main()
{
int n,i,j;
stack<char>s;
char str1[120],str2[120],flag=1;
while(scanf("%d",&n)!=EOF)
{
while(!s.empty())
s.pop();
cin>>str1>>str2;
for(i=0,j=0;i<n;i++)
{
s.push(str1[i]);
while(!s.empty()&&s.top()==str2[j])
{
s.pop();
j++;
}
}
if(!s.empty())
{
cout<<"NO"<<endl;
flag=0;
}
else
{
cout<<"YES"<<endl;
}
}
return 0;
}
标程:
#include<cstdio>
#include<cstring>
#include<stack>
#include<iostream>
using namespace std;
int main()
{
//freopen("data.in","r",stdin);
string s1,s2;
stack<char>s;
while(cin>>s1>>s2)
{
while(!s.empty())
s.pop();
int i=0,j=0;
while(j<s2.length())
{
if(s1[i]==s2[j])
{
i++;
j++;
}
else if(!s.empty()&&s.top()==s2[j])
{
s.pop();
j++;
}
else if(i<s1.length())
{
s.push(s1[i]);
i++;
}
else
break;
}
j==s2.length()?cout<<"YES"<<endl:cout<<"NO"<<endl;
}
return 0;
}
方法有记忆价值 有些思考点还有卡壳 但是..我要记下来...