UVA 11111 - Generalized Matrioshkas

这道题目很简单,题意也很好理解~用到了栈来做,跟括号匹配的问题属于同一类问题。

不同之处在于,在这里需要多判一步看是不是内层的toy的size大于外层的size,如果大于,则是失败的。


RE许多次的原因不在于数组小,也不在于stack的位置,也不在于eof的不使用。

而是在于自己忽略了一种极端的情况:如果一开始就给了一个正数——那么stack本来就是空的,再要求stack往外弹,就会使程序崩溃。


在这里还是得谢谢川哥,是他帮我指出了这一点。


另外还教了我清空stack的办法~:

while(!k.empty())
    k.pop();
很简单,但我一直没用过。


希望自己也能多积累一些经验,可以像川哥一样敏锐的发现错误的原因所在。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<stack>
using namespace std;
struct toy
{
    int Size;
    int vol;
}a[100000];
int main()
{
    int temp;
    char ch;
    int t=0;int flag=0;
    while(scanf("%d%c",&temp,&ch)!=EOF)
    {
        a[t].Size=temp;
        a[t++].vol=temp;
        if(ch=='\n')
        {
            flag=0;
            stack<toy>k;
            int i;
            for(i=0;i<t;i++)
            {
                if(a[0].Size>0)
                {
                    flag=1;
                    break;
                }
                if(i!=0&&k.size()==0)
                {
                    flag=1;
                    break;
                }
                if(a[i].Size<0)
                {
                    if(i==0)
                    {
                        k.push(a[i]);
                    }
                    else
                    {
                        k.top().vol-=a[i].Size;
                        if(k.top().vol>=0)
                        {
                            flag=1;
                            break;
                        }
                        k.push(a[i]);
                    }
                }
                else if(a[i].Size>0)
                {
                    int tt=k.top().Size;
                    if(a[i].Size+tt!=0)
                    {
                        flag=1;
                        break;
                    }
                    else
                    {
                        k.pop();
                        continue;
                    }
                }
            }
            int ttt=k.size();
            if(ttt!=0)
                flag=1;
            if(flag==1)
                printf(":-( Try again.\n");
            else
                printf(":-) Matrioshka!\n");
            t=0;
        }
    }
    return 0;
}


你可能感兴趣的:(C++,栈,stack,STL,uva)