栈—传纸条(重复字母的删除)

这是一个关于解密加密纸条的问题,其中加密规则是通过在原始英文信息中插入重复的字母。给定一组加密后的字符串,需要还原出没有相邻相同字母的原始内容。题目提供了一个示例,将加密后的字符串 'ssilofaafveuuu' 还原为 'iloveu'。这个问题可以通过栈数据结构来解决,删除所有连续出现的相同字母。

传纸条
Time Limit: 1000MS Memory Limit: 65536KB

Problem Description
XX 和 YY 经常在自习课的时候传纸条来传递一些私密性的信息。但是他们的座位相隔比较远,传纸条要通过其他人才能到达对方。在传递过程中,难免会有一些好奇心比较强的同学偷看纸条的内容。所以他们想到了一个办法,对纸条内容进行加密。
加密规则很简单:多次在信息的任意位置随意的添加两个相同的字母。
由于使用英文交流显得比较高端,所以他们的纸条内容只有英文。
现在给你加密后的信息,请你还原出原始的内容。

Input
输入数据的第一行为一个正整数 T(T ≤ 30),表示共有 T 组测试数据。
接下来 T 行,每行为一个字符串,字符串仅包含小写英文字母,且保证原始字符串中不包含相邻两个相同的字母,字符串长度不超过200000。

Output
每组数据输出一行字符串,表示还原后的内容。

Example Input
1
ssilofaafveuuu

Example Output
iloveu

Hint
样例解释:
删除掉aa后,又出现了ff,ff也要删除掉。
Author
“师创杯”山东理工大学第五届ACM程序设计竞赛

#include <stdio.h>
#include <string.h>
#define MAXN 200004
char s[MAXN];
char stacks[MAXN];
int main()
{
    int T, i, len, top;
    scanf("%d", &T);
    while(T--)
    {
        top = 0;
        scanf("%s", s);
        len = strlen(s);
        for(i = 0; i <= len-1;)
        {
            if(s[i] == s[i+1])
                i += 2;
            else if(stacks[top-1] == s[i])
            {
                top--;
                i++;
            }
            else
            {
                stacks[top++] = s[i++];
            }
        }
        stacks[top] = '\0';
        printf("%s\n", stacks);
    }
    return 0;
}


/***************************************************
User name: jk160630
Result: Accepted
Take time: 16ms
Take Memory: 304KB
Submit time: 2017-01-29 21:37:37
****************************************************/

think:我这几天在思考,或许栈和队列应该作为一种思想来理解,之前自己每学习一个知识点,似乎都是通过类似模板学习法,我认为模板学习法之前一直属于比较适合自己的学习方法,当开始接触一个新的知识点的时候,可以先记住最简单的例子,因为或许自己此时的理解是很浅显的,然后自己再一步步逐渐的理解,然而在学习数据结构之后,自己似乎应该考虑在模板学习方法的基础上建立新的更加高效的学习方法。或许自己应该在一种宏观把握下进行一种思想性的学习,作为一种思想来理解,而不是呆板的套用,要做到一种有思想的调用模板,在调用模板的同时拥有自己的思想感悟、展现自己的思想感悟,让自己在解决问题的过程中逐渐充满思想,进而形成一种比较优秀的思考问题的习惯。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值