括号匹配问题

来源:互联网 发布:大学生网络兼职论坛 编辑:程序博客网 时间:2024/05/08 18:35

括号配对问题

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3[(])(])([[]()])
样例输出
NoNoYes
//(1)数组#include<stdio.h>#include<string.h>int main(){    int n,i,k;    char ch[10005];    char sh[10005];    scanf("%d",&n);    while(n--)    {        scanf("%s",ch);        k=1;        for(i=0;i<strlen(ch);i++)        {            if(ch[i]=='[' || ch[i]=='(')//切记为‘||’                sh[k++]=ch[i];          //此处k++导致下面匹配减1            else if(ch[i]==']')            {                if(k>1 && sh[k-1]=='[')//切记此时sh的下标为k-1,若配对成功,则k--                    k--;                else{                    k++;               //若k=1 且 ch[i]=']',为第一个元素肯定不匹配                    break;                }            }            else if(ch[i]==')')       //同上            {                if(k>1 && sh[k-1]=='(')                    k--;                else{                    k++;    //切记此时不匹配时,要k++,使得此时k!=1                    break;                }            }        }        if(k==1) printf("Yes\n");        else printf("No\n");    }    return 0;}//***********************************************///(2)栈的思想,自己建栈#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>typedef struct mylist{    struct mylist *next;    char ch;}mylist;static mylist *stack;void push(char sh)//入栈{    mylist *new_list;    new_list=(mylist *)malloc(sizeof(mylist));    assert(new_list!=NULL);    new_list->ch=sh;    new_list->next=stack;    stack=new_list;}void pop()  //出栈{    mylist *pre;    assert(stack!=NULL);    pre=stack;    stack=pre->next;    free(pre);}int top() //栈顶元素{    assert(stack!=NULL);    return stack->ch;}void matching(char sh[]){    int i;    for(i=0;i<strlen(sh);i++)    {        if(sh[i]=='[' || sh[i]=='(')            push(sh[i]);        else if(sh[i]==']')        {            if(stack!=NULL && stack->ch=='[')                pop();            else{                push(sh[i]);//切记此时不匹配时,要push,使得此时stack!=NULL                break;            }        }        else if(sh[i]==')')        {            if(stack!=NULL && stack->ch=='(')                pop();            else{                push(sh[i]);//切记此时不匹配时,要push,使得此时stack!=NULL                break;            }        }    }    if(stack==NULL)        printf("Yes\n");    else        printf("No\n");}int main(){    int n;    char sh[10001];    scanf("%d",&n);    while(n--)    {        scanf("%s",sh);        stack=NULL;        matching(sh);    }    return 0;}//******************************************///(3)栈的思想 C++ 调用库函数#include <iostream>#include <stack>#include <string.h>using namespace std;int main(){    int i,n;    char ch[10001];    cin>>n;    while(n--)    {        cin>>ch;        stack<char>sh;        for(i=0;i<(int)strlen(ch);i++)        {            if(ch[i]=='[' || ch[i]=='(')                sh.push(ch[i]);            else if(ch[i]==']')            {                if(!sh.empty() && sh.top()=='[')//一定是否判断非空                    sh.pop();                else{                    sh.push(ch[i]); //不匹配,入栈,使栈不为空                    break;                }            }            else if(ch[i]==')')            {                if(!sh.empty() && sh.top()=='(')                    sh.pop();                else{                    sh.push(ch[i]);                    break;                }            }        }        if(sh.empty()) cout<<"Yes"<<endl;        else cout<<"No"<<endl;    }    return 0;}


原创粉丝点击