NXUOJ(ds二次考试编程复现)C2:小雏鸟穿衣服

这是一道关于栈应用的编程题,题目要求根据人的穿衣记录确定最后身上穿的是哪套衣服和裤子,确保字典序。解决方案是通过两个栈分别处理衣服和裤子的记录,每次入栈前比较栈顶元素,如果小于当前元素则出栈,直到栈顶元素小于当前元素。
摘要由CSDN通过智能技术生成

题目描述:
小雏鸟不能够理解人类为什么要穿衣服和裤子。
大白给他举了个栗子:如果把你的毛都剃了。。。。小雏鸟惊恐的抱紧了自己。。。
选择困难症的人如果有很多衣服和裤子,就可能在早上出门前不断的 穿衣服脱衣服 穿裤子脱裤子 来选择今天出门穿哪一套。
今天我们就根据这样的一个人的穿衣服裤子记录来看看最后到底穿了什么衣服和裤子出门。
我们用大写字母表示不同的衣服,用小写字母表示不同的裤子,字典序较小的表示穿在里面的。

输入:
每组样例有不超过 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);
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值