1. 程式人生 > >正則表示式(棧的應用)

正則表示式(棧的應用)

題目:

給定一個字串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; }