NYOJ NO.3 括号配对问题

来源:互联网 发布:json字符串解析 编辑:程序博客网 时间:2024/06/05 22:38

第一种:链表。

#include <stdio.h>#include <string.h>#include <stdlib.h> #define TRUE 1#define FALSE 0 typedef struct parenthesis{    parenthesis *front;    char parent;    parenthesis *next;}par; int operqueue(par *h);int judge(par *h);int find(par *h,char a);int rang(par *begin,par *end);par* getqueue(par *h); int main(){    int n;    scanf("%d", &n);    getchar();    while(n--)    {        par *h,*head,*oper;        if(NULL == (h =(par *)calloc(1, sizeof(par))))            return FALSE;        head = getqueue(h);        if(judge(head))            printf("Yes\n");        else            printf("No\n");    }    return 0;} int judge(par *h){    int sum = 0;    par *head,*oper;    oper = head = h;    while(head != NULL)    {        sum++;        head = head->next;    }    if(0 != sum%2)        return FALSE;    else        return operqueue(oper);} int operqueue(par *h){    par *head,*fron;    char flag1,flag2;    head = h;    do    {        while(')' != head->parent && ']' != head->parent)        {            if(NULL == head->next)                return FALSE;            head = head->next;        }        flag1 = head->parent;        if(')' == flag1)            flag2 = '(';        else            flag2 = '[';        fron = head->front;        while(flag2 != fron->parent)        {            if(0 != fron->parent)                return FALSE;            if(NULL == fron->front)                    return FALSE;            fron = fron->front;        }        fron->parent = head->parent = 0;    }    while(find(h, ']') || find(h, ')'));    return TRUE;}int find(par *h,char a){    par *head;    head = h;    while(head != NULL)    {        if(a == head->parent)            return TRUE;        head = head->next;    }    return FALSE;}int rang(par *begin,par *end){    int distance = 0;    par *b, *e;    b = begin;    e = end;    while(b != end)    {        distance++;        b = b->next;    }    return distance;}par* getqueue(par *h){    char m;    par *head;    head = h;    h->front = NULL;    h->parent = getchar();    while( (m = getchar())!= '\n')    {        par *n;        if(NULL == (n =(par *)calloc(1, sizeof(par))))           return NULL;        h->next = n;        n->front = h;        n->parent = m;        n->next = NULL;        h = h->next;    }    return head;}





第二种:伪堆栈。
 
#include <stdio.h>#define TRUE 1#define FALSE 0int judge(char s[]);int main(){    int n;    scanf("%d", &n);    getchar();    while(n--)    {        char queue[10005];        if(judge(queue))            printf("Yes\n");        else            printf("No\n");    }    return 0;}int judge(char s[]){    char flag1, flag2;    int top = 0;    while( (flag1 = getchar())!= '\n')    {        if('(' == flag1 || '[' == flag1)            s[top++] = flag1;        else        {            if(0 == top)            {                while(getchar() != '\n');                return FALSE;            }            if(')' == flag1)                flag2 = '(';            else                flag2 = '[';            if(flag2 != s[top-1])            {                while(getchar() != '\n');                return FALSE;            }            else            {                top--;            }        }    }    return TRUE;}
0 0