HPU_ACM暑期集训第二次积分赛 K题(括号括号)括号匹配C语言数据结构写法和c++写法

K 括号括号
时间限制 内存限制 出题人
1Second 512Mb 刘帅坤
题目描述
小明今年上大学,在大学里发现有很多同学都女朋友,两人整天都在一起腻歪,小明看到后感
觉很孤单,现在,给你一行括号序列,你来判断一下其中的括号是否配对。
输入
第一行输入一个数 N (0< N< 100)表示有N组测试数据。后面的N行输入多组输入数据,每组
输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保
证S中只含有”[“,”]”,”(“,”)” 四种字符 ,输入以“EOF”结束。
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则
输出No。
输入样例
3
[(])
(])
([])
输出样例
No
No
Yes
注意:此题的测试数据组是多组的。

括号匹配AC代码(c语言数据结构写法)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define STACK_INIT_SIZE 10000
#define STACKINCREMENT 10
typedef struct{
    char *top;
    char *base;
    int stacksize;
}SqStack;
int initstack(SqStack &S)
{
    S.base=(char*)malloc(STACK_INIT_SIZE * sizeof(char));
    if(!S.base)
    return 0;
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return 1;

}
int pop(SqStack &S)
{
    char e;
    if(S.top==S.base)
    return 0;
    e=*--S.top;
    return 1;
}
int stackempty(SqStack &S)
{
    if(S.top==S.base)
    return 1;
    if(S.top!=S.base)
    return 0;
}
int push(SqStack &S,char e)
{

    if(S.top-S.base>=S.stacksize)
    {
        S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT* sizeof(char)));
        S.base=S.base+S.stacksize;
        S.stacksize+=STACKINCREMENT;

    }
    *S.top++=e;
    return 1;
}
int gettop(SqStack &S)
{
    char e;
    if(S.top==S.base)
    return 0;
     e=*(S.top-1);
     return  e;
}

int main()
{
    SqStack S;
    char ch[10000],*p;
    int answer;
    int n;
    while(scanf("%d",&n)!=EOF)
    {

    getchar();
    while(n--)
    {

   scanf("%s",ch);
    {
        initstack(S);
        answer=0;
        p=ch;
    while(*p!='\0')
        {
            if(*p=='[')
            push(S,*p);
            else if(*p=='(')
            push(S,*p);
            else if(*p==']')
            {

                if(gettop(S)=='[')
                pop(S);
                else
                {
                answer=1;
                 break;
                }
             } 
             else if(*p==')')
             {
                if(gettop(S)=='(')
                {
                    pop(S);
                 }
                else
                 {
                  answer=1;
                  break;
                 }
             }
             else
             {
                answer=1;
                break;
             }

             p++;

        }
     if(answer==0&&stackempty(S))
    printf("Yes\n");
    else
    printf("No\n");
    }

}
}
    return 0;
}

括号匹配AC代码(c++stl中的stack写法)

#include<stdio.h>
#include<iostream>
#include<stack>
#include<string.h>
const int N=10000+1;
using namespace std;
stack<char>sk;
char str[N];
int main()
{
    int T,answer;
    while(~scanf("%d",&T))
    {

        getchar();
        while(T--)
        {
            answer=0;
            while(!sk.empty()) 
            sk.pop();
            memset(str,0,sizeof(str));
            gets(str);
            int len=strlen(str);
            for(int i=0;i<len;i++)
            {
                if(str[i]=='['||str[i]=='(')
                sk.push(str[i]);
                else if(str[i]==']')
                {
                    if(sk.top()=='[')
                    sk.pop();
                    else
                    {
                        answer=1;
                        break;
                    }
                }
                else if(str[i]==')')
                {
                    if(sk.top()=='(')
                    sk.pop();
                    else
                    {
                        answer=1;
                        break;
                    }
                }
            }
            cout<<sk.size()<<endl;
        if(answer==0&&sk.empty())
            printf("Yes\n");
            else
            printf("No\n");
        }
    }
    return 0;
}

思路:只要是左括号都入栈,当遇到右括号就判断它的栈顶元素是否为对应的左括号,如果是把栈顶元素出栈,不是则把answer置为1,只要有一个不匹配则无需再进行下去。
判断是否完全匹配,则看是否answer=0,因为一旦有不匹配的,则answer会=1,并且栈必须为空,为什么呢?比如((),此时遇到右括号他们是匹配的,但是多出一个左括号,如果不加上栈为空的条件则会判断这种情况是正确的,但其实是错误的。
光有一个栈是否为空行不行?不行,比如())的情况,遇到右括号出栈,此时栈为空,但并不完全匹配。
所以必须两个条件都满足。
这仅是一个思路,其它的写法也可以。

猜你喜欢

转载自blog.csdn.net/qq_42817826/article/details/81428635
今日推荐