题目描述:
小雏鸟不能够理解人类为什么要穿衣服和裤子。
大白给他举了个栗子:如果把你的毛都剃了。。。。小雏鸟惊恐的抱紧了自己。。。
选择困难症的人如果有很多衣服和裤子,就可能在早上出门前不断的 穿衣服脱衣服 穿裤子脱裤子 来选择今天出门穿哪一套。
今天我们就根据这样的一个人的穿衣服裤子记录来看看最后到底穿了什么衣服和裤子出门。
我们用大写字母表示不同的衣服,用小写字母表示不同的裤子,字典序较小的表示穿在里面的。
输入:
每组样例有不超过 20000 条数据,每个数据有一行字符串,表示主人公的穿衣穿裤记录。
注意,该行字符串中不包含脱衣裤记录,但是最后主人公身上的衣服裤子一定是字典序。
输入保证至少有一件衣服一条裤子。
输出:
每行数据输出两行字符串,表示主人公从里到外的衣服/裤子。
样例输入:
AazCvFyBzRTWbcD
样例输出:
ABD
abc
题目思路:
该题主要涉及到栈的相关知识点,需要设置两个栈,一个栈记录穿衣,另一个栈用来记录穿裤,因为最后主人公身上的衣服裤子一定是字典序,因此穿衣穿裤时每次都会和相应的栈所对应的栈顶元素进行比较,如果栈顶元素比该元素来得大,则需要进行出栈操作,反复循环比较,直至该元素比栈顶元素来得大为止,然后再将该元素入栈,这样便能保证最后主人公身上的衣服裤子一定是字典序!
参考代码:
#include <stdio.h>
#include <string.h>
#define MAX 20001
typedef struct{
char ele[MAX];
int top;
}Seq,*seq;
char ch[MAX];
char a[MAX];
char b[MAX];
/*栈初始化*/
void init(seq s)
{
s->top=-1;
}
/*判断栈空*/
int isEmpty(seq s)
{
if(s->top==-1)
return 1;
else
return 0;
}
/*判断栈满*/
int isFull(seq s)
{
if(s->top==MAX-1)
return 1;
else
return 0;
}
/*入栈*/
int push(seq s,char str)
{
if(isFull(s)==1)
return 0;
else
{
s->top++;
s->ele[s->top]=str;
return 1;
}
}
/*出栈*/
char pop(seq s)
{
if(isEmpty(s)==1)
return 0;
else
{
char t=s->ele[s->top];
s->top--;
return t;
}
}
/*求栈长*/
int stacklength(seq s)
{
return s->top+1;
}
void wear(char *ch)
{
int i=0,j;
Seq s1,s2;
init(&s1);
init(&s2);
while(ch[i]!='\0')
{
if(ch[i]>='A'&&ch[i]<='Z')
{
while(ch[i]<s1.ele[s1.top])
pop(&s1);
push(&s1,ch[i]);
}
if(ch[i]>='a'&&ch[i]<='z')
{
while(ch[i]<s2.ele[s2.top])
pop(&s2);
push(&s2,ch[i]);
}
i++;
}
int t1=stacklength(&s1);
int t2=stacklength(&s2);
for(i=0;i<t1;i++)
a[i]=pop(&s1);
for(j=0;j<t2;j++)
b[j]=pop(&s2);
for(i=t1-1;i>=0;i--)
printf("%c",a[i]);
printf("\n");
for(j=t2-1;j>=0;j--)
printf("%c",b[j]);
printf("\n");
}
int main()
{
while(scanf("%s",ch)!=EOF)//循环输入。
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
wear(ch);
}
}