正则表达式(栈的应用)

来源:互联网 发布:淘宝店铺 武汉飞鱼运动 编辑:程序博客网 时间:2024/06/15 23:57

题目:

给定一个字符串S,判断其是否为合法的正则表达式

一个正则表达式定义:(此正则表达式非正规)

  • 0是正则表达式,1是正则表达式
  • P和Q是正则表达式,则PQ是正则表达式
  • P是正则表达式,则(P)是正则表达式
  • P是正则表达式,则P*是正则表达式
  • P和Q是正则表达式,则P|Q是正则表达式

输入样例:

010101101*
(11|0*)*
)*111
#

输出样例:

YES
YES
NO

题解:

用一个栈来存储出现的(和|,遇到)判断此时是否合法,检查栈的)符号。遇到|或(,将当前字符串的起始位置设置为这个位置,用一个bool标记当前串是否为合法。(解释不清楚,看代码,,,)

代码:

#include<cstdio>#include<cstring>const int MAXN=10000010;char str[MAXN];int top;char op[MAXN];int main(){    int n;    bool success;    while(~scanf("%s",str))    {        if(str[0]=='#')            break;        top=0;        success=0;        n=strlen(str);        for(int i=0;i<n;i++)        {            if(str[i]=='0'||str[i]=='1')                success=1;            else if(str[i]=='(')            {                op[top]='(';                success=0;            }            else if(str[i]==')')            {                while(success&&op[top]!='('&&top>0)                    top--;                if(!success)                    break;                if(top!=0&&op[top]=='(')                    top--;                else                {                    success=0;                    break;                }            }            else if(str[i]=='*')            {                if(!success)                    break;            }            else if(str[i]=='|')            {                if(!success)                    break;                op[top]='|';                success=0;            }            else            {                success=0;                break;            }        }        while(top)        {            if(op[top]=='|'&&success)                top--;            else            {                success=0;                break;            }        }        if(success)            printf("YES\n");        else            printf("NO\n");    }    return 0;}

另一做法:Na2O博客

原创粉丝点击