括号匹配及其变形

来源:互联网 发布:c语言怎么实现多线程 编辑:程序博客网 时间:2024/06/06 03:15

给你一些括号,问它们是否可以完全匹配

  1. 遍历输入字符串
  2. 遇到左括号(,{,[<,将该字符入栈,遇到右括号)}]>,返回栈顶元素,如果该元素与栈顶元素相匹配,则将栈顶元素出栈,继续循环,否则退出循环。
#include <cstdio>#define maxSize 10000typedef struct sta{    char elem[maxSize];    int top;    }SeqStack;void InitStack(SeqStack&s){    s.top=-1;}void Push(SeqStack&s,char x){        s.elem[++s.top]=x;}void Pop(SeqStack&s){    s.top--;}int GetTop(SeqStack&s,char &x){    if (s.top==-1)    {        return 0;        /* code */    }    x=s.elem[s.top];    return 1;}int Empty(SeqStack&s){    return s.top==-1;}int getResult(char st[],SeqStack&s){    int i=0;    while(st[i]!='\0')    {        if (st[i]=='('||st[i]=='['||st[i]=='{'||st[i]=='<')        {            Push(s,st[i]);            /* code */        }        else if(st[i]==')'||st[i]==']'||st[i]=='}'||st[i]=='>')        {            char ch;            int flag=GetTop(s,ch);            if(flag){                if((ch=='('&&st[i]==')')||(ch=='['&&st[i]==']')||(ch=='{'&&st[i]=='}')||(ch=='<'&&st[i]=='>'))                {                    Pop(s);                }                else                    return 0;            }            else{                return 0;            }            /* code */        }        i++;    }    if(Empty(s))        return 1;    return 0;}char str[105];int main(int argc, char const *argv[]){    while(~scanf("%s",str))    {        SeqStack s;        InitStack(s);        int signal=getResult(str,s);        if (signal)        {            printf("Yes\n");        }        else{            printf("No\n");        }    }    return 0;}

https://biancheng.love/problem/725/index

写在表达式里常用的括号共有3种:大括号”{ }”,中括号”[ ]”,小括号“( )”,而且小括号里面不能够有其他括号,中括号里面只能有小括号,只有大括号可以包含大括号。不过mdd总是忘记这些规则,你能够帮助他判断这些表达式是否正确吗?

  1. 遍历输入的字符串
  2. 如果是左括号即入栈
  3. 如果是右括号,则需根据题意进行比较返回当前栈顶元素和栈顶向下第二个元素。然后根据匹配规则进行相应的出栈或者退出循环操作,具体见代码注释
#include <cstdio>#define maxSize 10000typedef struct sta{    char elem[maxSize];    int top;    }SeqStack;void InitStack(SeqStack&s){    s.top=-1;}void Push(SeqStack&s,char x){        s.elem[++s.top]=x;}void Pop(SeqStack&s){    s.top--;}int GetTop(SeqStack&s,char &x){    if (s.top==-1)    {        return 0;        /* code */    }    x=s.elem[s.top];    return 1;}int GetSecondTop(SeqStack&s,char &x){    if (s.top-1==-1)    {        return 0;        /* code */    }    x=s.elem[s.top-1];    return 1;}int Empty(SeqStack&s){    return s.top==-1;}int getResult(char st[],SeqStack&s){    int i=0;    while(st[i]!='\0')    {        if (st[i]=='('||st[i]=='['||st[i]=='{')        {            Push(s,st[i]);            /* code */        }        else if(st[i]==')'||st[i]==']'||st[i]=='}')        {            char ch,ch1;            int flag=GetTop(s,ch);//flag为是否有栈顶元素            int flag1=GetSecondTop(s,ch1);//flag1为是否有次级栈顶元素            if(flag==1&&flag1==0)//如果无次级栈顶元素,则按照普通的匹配规则进行匹配            {                if((ch=='('&&st[i]==')')||(ch=='['&&st[i]==']')||(ch=='{'&&st[i]=='}'))                {                    Pop(s);                }                else                    return 0;            }            else if(flag==1&&flag1==1){//如果有次级栈顶元素                if((ch=='('&&ch1!='('&&ch1!='{'&&st[i]==')'))//如果栈顶是(,则不允许次级栈顶元素为(和{                    Pop(s);                else if((ch=='['&&ch1!='['&&ch1!='('&&st[i]==']'))//如果栈顶为[,则不允许次级站定元素为[和(                    Pop(s);                else if((ch=='{'&&ch1!='('&&ch1!='['&&st[i]=='}')){//如果栈顶为{,则不允许次级栈顶元素为(和[                                  Pop(s);                    }                else                    return 0;            }            else{                return 0;            }            /* code */        }        i++;    }    if(Empty(s))        return 1;    return 0;}char str[105];int main(int argc, char const *argv[]){    while(~scanf("%s",str))    {        SeqStack s;        InitStack(s);        int signal=getResult(str,s);        if (signal)        {            printf("Yes\n");        }        else{            printf("No\n");        }    }    return 0;}
0 0
原创粉丝点击