POJ1068 Parencodings【用一个int变量作为栈】

Problem: 1068   User: qq1203456195
Memory: 164K   Time: 0MS
Language: C   Result: Accepted

开始没读明白题的意思【鄙人英文太烂】,百度了题意,刚接触算法时间不长,没啥好想法,就想先根据q序列把()序列还原,然后再推w序列。

用了一个中午的时间把q序列还原成()了,然后就是推w序列。

既然是运算符匹配,肯定是栈了。又不想弄一个栈出来,怎么办呢?突然想到用一个变量就可以了,因为序列中只有(和非(两种情况,只要两类字符的数目抵消就是匹配完了。

#include <stdio.h>
#include <string.h>
int main()
{
    int n,i,k,m,d,q,p,r,tk;
    char c[41];
    scanf("%d",&n);//n个case
    while (n--)
    {
        //构造()序列
        scanf("%d",&k);//q序列中k个元素

        memset(c,'(',sizeof(c));
        d=0;//(的数量
        q=0;//栈
        tk=k;//temp_k
        scanf("%d",&m);//q中的元素
        tk--;//读取一个就记录一个        
        for (i=0;i<2*k;i++)
        {
            if(d==m && c[i]=='(')//匹配
            {//确定Wi
                q=r=1;
                p=i-1;
                while(q&&p>=0)
                {
                    if (c[p]=='(')    
                        q--;//出栈
                    else
                    {
                        q++;//入栈
                        r++;//)的数量
                    }
                    p--;                    
                }
                c[i]=r+48;
                if(tk--)//读一个q中的元素
                    scanf("%d",&m);
            }
            if(c[i]=='(')
                d++;//统计(的数量                    
        }
        for (i=0;i<2*k-1;i++)
        {
            if(c[i]!='(')
                printf("%d ",c[i]-48);
        }
        printf("%d\n",c[i]-48);
    }
    return 1;
}
字节跳动内推

找我内推: 字节跳动各种岗位
作者: ZH奶酪(张贺)
邮箱: cheesezh@qq.com
出处: http://www.cnblogs.com/CheeseZH/
* 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/CheeseZH/p/2446236.html