ACM括号配对问题

输入:第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符。

输出:每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No

样例输入:

3
[(])
(])
([[]()])样例输出:
No
No
Yes

这是南阳理工学院ACM练习题,我的程序如下:在练习这道题时,我学会了栈的知识和用法;二维数组动态空间的开辟和释放方法;最重要的是学会了这种思维方式,mark一下。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define  TRUE    1
#define  FALSE    0
#define  StackSize    10000

typedef struct{
    char data[StackSize];
    int top;
}SqStack;

int num1 = 0,num2 = 0;

void InitStack(SqStack *s);
int StackEmpty(SqStack *s);
int StackFull(SqStack *s);
int Push(SqStack *s,char x);
char Pop(SqStack *s);
int StackTop(SqStack *s,char *x);
void Bracket(SqStack *s, char *a);

int main(void)
{
    int N = 0;
    int i = 0,j = 0,k = 0;
    int *length;
    char **s;
    SqStack S;

    scanf("%d",&N);
    //开辟二位数组动态内存空间,N行10000列
    s = (char **)malloc(sizeof(char *)*N);
    for(i = 0;i < N;i++)
        s[i] = (char *)malloc(sizeof(char)*10000);

    for(i = 0;i < N;i++)
    {
        if(‘\n‘ == getchar())
        {
            scanf("%s",s[i]);
        }
    }

    for(i = 0;i < N;i++)
    {
        Bracket(&S, s[i]);
        if(num1 == 0 && num2 == 0)
        {
            printf("YES\n");
        }
        else
            printf("NO\n");

        num1 = num2 = 0;
    }

    system("pause");
    for(i = 0;i < N;i++)
        free(s[i]);
    free(s);
    return 0;
}

void Bracket(SqStack *s, char *a)
{
    int i,j,length = strlen(a);

    InitStack(s);

    for(i = 0;i < length;i++)
    {
        switch(a[i])
        {
        case ‘[‘:Push(s,a[i]);num1++;break;
        case ‘(‘:Push(s,a[i]);num2++;break;
        case ‘]‘:
                if(‘[‘ == Pop(s) || FALSE == Pop(s))
                 {
                     num1--;
                 }
                break;
        case ‘)‘:
                if(‘(‘ == Pop(s) || FALSE == Pop(s))
                 {
                     num2--;
                 }
                break;
        default:break;
        }

    }
}

void InitStack(SqStack *s)
{
    s->top = -1;    //初始化的顺序栈为空
}

int StackEmpty(SqStack *s)
{
    if(s->top == -1)
        return TRUE;
    else
        return FALSE;
}

int StackFull(SqStack *s)
{
    if(s->top == StackSize-1)
        return TRUE;
    else
        return FALSE;
}

int Push(SqStack *s,char x)
{
    if(StackFull(s))
    {
        //printf("StackFull~\n");
        return FALSE;
    }
    else
    {
        s->top++;
        s->data[s->top] = x;
        return TRUE;
    }
}

char Pop(SqStack *s)
{
    if(StackEmpty(s))
    {
        //printf("StackEmpty~\n");
        return FALSE;
    }
    else
    {
        return s->data[s->top--];
    }
}

int StackTop(SqStack *s,char *x)
{
    if(StackEmpty(s))
    {
        //printf("StackEmpty~\n");
        return FALSE;
    }
    else
    {
        *x = s->data[s->top];
        return TRUE;
    }
}
 
 
时间: 2024-11-09 09:43:30

ACM括号配对问题的相关文章

ACM:括号配对问题

括号配对问题:http://acm.nyist.net/JudgeOnline/problem.php?pid=2 思路:利用栈先进后出的性质,左符入,右符出. #include<iostream> #include<string> #include<stack> using namespace std; bool check(string str) { stack<char> stack; for (int i = 0; i < str.length

ACM试题 - 括号配对问题 - Java中字符串截取和定位问题

ACM试题题源(括号配对问题):http://acm.nyist.net/JudgeOnline/problem.php?pid=2 提交代码: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); int n = cin.nextInt(); String[] ans = new String[n];

ACM:UESTC - 649 括号配对问题 - stack

  UESTC - 649  括号配对问题 Time Limit: 1000MS   Memory Limit: 65535KB   64bit IO Format: %lld & %llu Description 大家都知道算术表达式中,括号必须配对,现在任意给出一个算术表达式,判断其括号是否配对.如果配对,输出Yes,否则输出No. Input 含多组测试数据,输入首先是一个整数T表示测试数据组数(0<T≤300).随后有T行测试数据,长度不超过1000个字符,字符串间不含空格. Out

NYOJ 2 括号配对问题【栈的运用】

括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组.数据保证S中只含有"[","]","(",")"四种字符 输出 每组输入数据的输出占一行,

NYOJ 2 括号配对问题

/* 题目大意:求括号是否配对 解题思路:开一个数组b,来作为栈,top为栈的下个下标控制入栈和出栈 难点详解:见代码 关键点:对进栈和出栈了解深刻一点 解题人:lingnichong 解题时间:2014/08/15  19:46:45 解题体会:最基本栈的运用.一开始还不是很清楚.可以先背一下,每天睡觉前再看一下,到用的时候,再根据这个模板写出来就可以了,这样印象会更加深刻了 */ #include<stdio.h> #include<string.h> #define MAXN

nyist 2 括号配对问题

括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组.数据保证S中只含有"[","]","(",")"四种字符 输出 每组输入数据的输出占一行,

NYOJ2 括号配对问题

括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组.数据保证S中只含有"[","]","(",")"四种字符 输出 每组输入数据的输出占一行,

括号配对问题--nyoj-题目2

括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组.数据保证S中只含有"[","]","(",")"四种字符 输出 每组输入数据的输出占一行,如

NYOJ题目2括号配对问题

括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组.数据保证S中只含有"[","]","(",")"四种字符 输出 每组输入数据的输出占一行,