Rails/Parentheses_Balance

一、栈

特点:同进同出,栈里顺序不能改变
代码实现:定义一维数组为栈a[n],下标为top的单元a[top]为栈顶;入栈:top++,对a[top]赋值;出栈:top–

二、scanf()函数

格式:scanf(“%x”,&a);
特点:对被定义格式变量进行输入,如定义输入整型变量,空格或回车就表示输入结束,输入单个变量后面不能加空格;
若定义输入字符变量,那么空格或回车会被当做字符变量输入,对于字符变量输入用fgets()函数更为适合;
scanf函数输入结束后会有’\n’换行字符在末尾,在后面使用fgets()函数的时候就要注意(Parentheses_Balance括号匹配一题中就有所体现)

三、fgets()函数

格式:fgets(char * s,int size,FILE * stream);(数组/字符串名;读入字符串长度;输入设备或变量(通常键盘stdin) )
特点:读取规定长度的字符串,可以包含空格,最后一位为结束符’\0’
若字符串长度大于size-1,就读到size-1位字符,在最后一位补充’\0’结束;
若字符串长度小于size-1,就读取所有字符,在最后一位补充’\0’结束;
‘\n’字符在’\0’字符之前,所以在使用fgets()函数时设置长度要考虑可能隐藏的’\n’字符,设置size在不超内存的情况下长于要求所给的长度,避免读取出现错误(Parentheses_Balance括号匹配一题中就有所体现,若读取size129输入为128个括号时就会出现bug)

四、strlen()函数:

格式:unsigned int strlen (char *s);
特点:读取字符长度,不包含结束符’\0’,函数返回值为字符长度

五、debug心得:

1、使用while()循环时要注意循环最后要初始化相关变量,要与while()循环前的设定保持一致,当多组数据验证时后者的数据结果输出出错时就可以考虑是否是这里出了bug
2、边界情况需要单独考虑,可能出现特殊错误,如读取错误。
3、使用输入函数输入变量时可能隐藏空格,换行,结束字符,对后面变量使用出现错误,debug时可以用printf()函数输出验证输入是否正确(通过输出ASCII码可以找到隐藏字符输入)。
4、低级错误:变量名用错,格式用错,对函数格式理解不透彻

Rails

入栈出栈顺序

题目:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=354&page=show_problem&problem=45#

#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int a[1000],b[1000];
    int i,j,k;
    int top=-1;
    while(n!=0)
    {
        for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            if(a[i]==0)
                break;
        }
        while(a[0]!=0)
        {
            k=n;
            j=n-1;
            while(j>=0)
            {
                if(top!=-1)
                {
                    if(b[top]==k)
                    {
                        top--;
                        k--;
                    }
                    else if(a[j]!=k)
                    {
                        top++;
                        b[top]=a[j];
                        j--;
                    }
                    else
                    {
                        k--;
                        j--;
                    }
                }
                else if(a[j]!=k)
                {
                    top++;
                    b[top]=a[j];
                    j--;
                }
                else
                {
                    k--;
                    j--;
                }
            }
            while(top!=-1)
            {
                if(b[top]==k)
                {
                    top--;
                    k--;
                }
                else
                {
                    printf("No\n");
                    break;
                }
            }
            if(k==0)
                printf("Yes\n");
            for(i=0;i<n;i++)
            {
                scanf("%d",&a[i]);
                if(a[i]==0)
                break;
            }
        top=-1;
        }
            printf("\n");
            scanf("%d",&n);
    }
    return 0;
}

Parentheses_Balance

括号匹配

题目https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=354&page=show_problem&problem=614#

#include <stdio.h>
#include <string.h>
int main()
{
    //freopen("in.txt","r",stdin);
    int n,m;
    scanf("%d",&n);
    char a[130],b[130],c[10];
    int i,j,k=0;
    int top=-1;
    fgets(c,10,stdin);
    for(i=0;i<n;i++)
    {
        fgets(a,130,stdin);
        m=strlen(a);
        //printf("%d",m);
        for(j=0;j<m-1;j++)
        {
            if(a[j]=='('||a[j]=='[')
            {
                top++;
                b[top]=a[j];
                k++;
            }
            else if( (b[top]=='('  &&  a[j]==')')  ||  (b[top]=='['  &&  a[j]==']') )
            {
                top--;
                k++;
            }
        }
        if(k==m-1&&top==-1)
            printf("Yes\n");
        else
            printf("No\n");
        k=0;
        top=-1;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值