作为合格的男票
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 22 Accepted Submission(s) : 9
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
作为一名合格的男朋友,要随时帮女朋友解决学习上的问题。
最近你的女朋友在学HTML,因为没有一个好的编辑器,她有时候会漏掉某些闭合标签,
现在,你看到了女朋友写的HTML代码,要判断她的代码中所有标签是否都正确闭合。
HTML标签分两种,成对出现的如<p></p>,单独闭合的<br/>。标签不允许嵌套,比如<p><div></p></div>是不合法的。这里有一份HTML标签介绍
Input
第一行一个整数T,接下来T组输入,每组输入是经过压缩的代码,长度不超过1000,即不包含空格,只有标签,标签中没有属性,所有标签也没有innerHTML。保证所有的标签都是合HTML语法的,所有单标签都被正确的关闭(即不会出现<br>、<input>等,而是<br/>、<input/>)。
Output
你应该输出T行,对每组输入,若女友的HTML代码中所有标签都正确闭合了,输出YES,否则输出NO
Sample Input
3 <html><head><meta/><title></title></head><body></body></html> <br/></p><p> <body><a></body></a>
Sample Output
YES NO NO
用栈模拟
ac:
#include<bits/stdc++.h>
using namespace std;
char str[1010];
struct node
{
char ctr[20]={0};
}dd;
int cmp(node a,node b)
{
int alen=strlen(a.ctr);
int blen=strlen(b.ctr);
if(alen+1!=blen)
return 1;
else{
for(int i=0,j=1;i<alen;i++,j++)
if(a.ctr[i]!=b.ctr[j])
return 1;
return 0;
}
}
int main()
{
stack<node> st;
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",&str);
int len=strlen(str);
for(int i=0;i<len;i++)
{
if(str[i]=='<')
{
int j=i;
while(str[i]!='>')
i++;
if(str[i-1]=='/') continue;
node cc;
for(int g=0,k=j+1;k<=i-1;k++)
{
cc.ctr[g]=str[k];
g++;
}
if(st.size()!=0)
{
dd=st.top();
if(cmp(dd,cc)==0)
st.pop();
else
st.push(cc);
}
else st.push(cc);
}
}
if(st.size()==0)
printf("YES\n");
else
{
printf("NO\n");
while(!st.empty())
st.pop();
}
}
return 0;
}