以前一直以为栈是个很复杂的东西,今天第一次用这个东西写题居然一次AC,欣喜之余发篇文纪念一下 #(滑稽)

题目描述

又到了天勤计算机考研《高分笔记》专业课辅导系列书籍发售的时候了,在ACM俱乐部团队的办公室里堆着许多新版的高分笔记准备出售。
团队成员平时喜欢用高分笔记叠罗汉,以此来锻炼身体。不过,他们是按照一定的规则来叠的,规则如下:
(为方便起见,我们用D代表数据结构高分笔记,用P代表计算机组成原理高分笔记,用O代表操作系统高分笔记,用N代表计算机网络高分笔记。)
(1)D可以叠在P、O、N三者任意一个的上面,但是D上面就不能再叠其他的书了。
(2)P、O、N三者可以互相层叠,也可以多本P(或O、N)叠在一起。但是,不允许大于等于2本的D叠在一起。
(3)D的下方必须至少叠有一本书,且每堆的最上面必须是D,否则不算作一堆。
现在给你一个序列,表示他们拿书的顺序,后取的书只能放在先取的上面。如果某本书无法叠放,则抛弃。
请你编程计算他们叠出的每堆书的本书。

输入

输入包含多组测试数据。
每组输入占一行,为一个字符串,字符串中只包含D、P、O、N四个字母,此字符串从左往右表示他们拿书的顺序,字符串的长度不大于50。

输出

对于每组输入,在一行内按照先后顺序输出他们叠出的每堆书的本数,相邻的结果之间输出一个空格。如果一堆都叠不出来,则输出0。

样例输入

POND
DPPODNOD
ONPDNNDODPP
DPON

样例输出

4
4 3
4 3 2
0

代码:

#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;

int main()
{
    char a[60];
    // freopen("input.txt", "r", stdin);
    while(scanf("%s", a) != EOF)
    {
        int len = strlen(a), cnt = 0, ans[30], i = 0;
        stack<char> s;
        while(cnt < len)
        {
            char now = a[cnt++];
            if(now == 'D' && !s.empty())
            {
                s.push(now);
                ans[i++] = s.size();
                while(!s.empty())
                    s.pop();
            }
            else if(now=='P' || now=='O' || now=='N')
                s.push(now);
        }
        for(int j = 0; j < i-1; j++)
            printf("%d ", ans[j]);
        printf("%d\n", ans[i-1]);
    }
    return 0;
}

不要害怕!你能AC!哈哈~

标签: acm, , 数据结构

添加新评论