ACM括號配對問題

輸入:第一行輸入一個數N(0<N<=100),表示有N組測試數據。後面的N行輸入多組輸入數據,每組輸入數據都是一個字符串S(S的長度小於10000,且S不是空串),測試數據組數少於5組。數據保證S中只含有"[","]","(",")"四種字符。數組

輸出:每組輸入數據的輸出佔一行,若是該字符串中所含的括號是配對的,則輸出Yes,若是不配對則輸出No測試

樣例輸入:spa

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;
    }
}
相關文章
相關標籤/搜索