zoukankan      html  css  js  c++  java
  • NFA的实现

      此次发表的是一个不确定的自动机(NFA),它可以根据输入的正规式输出由函数映像表示的结果。

      此版本可以输入括号’(‘,‘)’,但是,实现的过程理解起来有点吃力,所以,在时间允许的情况下,我还将写新文章,使用单纯递归方法实现该程序。

    #include"stdio.h"
    #include"stdlib.h"
    #define MAX 200
    
    struct Stack
    {
        int Stack[MAX];
        int top;
    }St;
    
    struct Queue
    {
        int front;
        int rear;
        int elem[MAX];
    }Q;
    
    void Input(char String[]);
    void initStack(); //初始化栈
    void PushStack(int x); //进栈
    int PopStack(); //出栈
    void initQueue();
    void InserQ(int x);
    int Gethead();
    void decompose(char String[]);
    int deal_1(char String[],int front,int rear);//处理a.b.a...
    int deal_2(char String[],int front,int rear);//处理a|b|a....
    int deal_3(char String[],int front,int rear);//处理a*
    void cut_string(int start, int end, char String[], char temp[]);
    
    int num = 0;
    
    main()
    {
        char String[MAX];
        int i;
        while(1){initStack();
        Input(String);
        //printf("%s",String);
        decompose(String);}
    
    
    }
    
    void Input(char String[])
    {
        char temp;
        int i = 0;
        printf("请输入正规式:");
        do{
            temp = getchar();
            //printf("%c",temp);
            String[i] = temp;
            i++;
        }while(temp != '
    ');
    
    }
    
    void initStack()
    {
        St.top = -1;
    }
    
    void PushStack(int x)
    {
        St.top++;
        St.Stack[St.top] = x;
    }
    int PopStack()
    {
        int temp;
        temp = St.Stack[St.top];
        St.top--;
        return temp;
    }
    
    void initQueue()
    {
        Q.front = Q.rear = 0;
    }
    
    void InserQ(int x)
    {
        if((Q.rear + 1)%MAX == Q.front)
            return;
        else
        {
            Q.elem[Q.rear] = x;
            Q.rear = (Q.rear + 1) % MAX;
        }
    }
    
    int Gethead()
    {
        int x;
        if(Q.rear == Q.front)
            printf("null
    ");
        else
        {
            x = Q.elem[Q.front];
            Q.front = (Q.front+1)%MAX;
        }
        return x;
    }
    
    
    void decompose(char String[])
    {
        int flag_index = 0;
        char x[MAX];
        int temp;
        int i;
        while(String[flag_index] != '
    ')
        {
            if(String[flag_index] == '(')
            {
                PushStack(flag_index+1);
                flag_index++;
                while(String[flag_index] != '
    ' && St.top != -1)
                {
                    if(String[flag_index] == '(')
                    {
                        PushStack(flag_index+1);
                        flag_index++;
                    }
                    else if(String[flag_index] == ')')
                    {
                        temp = PopStack();
                        flag_index++;
                        if(String[flag_index] == '*')
                        {
                            cut_string(temp-1,flag_index,String,x);
                            deal_3(x,num,num);
                            flag_index++;
                        }
                        else
                        {
                            cut_string(temp,flag_index-2,String,x);
                            decompose(x);
                        }
    
                    }
                    else flag_index++;
                }
            }
            for(i = flag_index ; String[i] != '
    ' && String[i] != '('; i++);
            if(i != flag_index)
            {
               // printf("1");
                cut_string(flag_index,i-1,String,x);
                num++;
                deal_2(x,num-1, num);
    
            }
    
            //printf("%s",cut_string(flag_index,i - 1,String));
            flag_index = i;
    
        }
    
    }
    
    int deal_1(char String[],int front,int rear)
    {
        int flag_index = 0;
        //printf("%s",String);
        if(String[flag_index+1] != '
    ')
        {
            printf("f(%d, %c) = %d
    ",front,String[flag_index],num);
            flag_index++;
            while(String[flag_index+2] != '
    ')
            {
                //printf("%c",String[flag_index]);
                if(String[flag_index]>='a' && String[flag_index]<='z')
                {
                    printf("f(%d, %c) = %d
    ",num,String[flag_index],num+1);
                    flag_index++;
                    num++;
                }
                else
                    flag_index++;
            }
            // printf("%c",String[6]);
            printf("f(%d, %c) = %d
    ",num,String[flag_index+1],rear);
        }
        else
            printf("f(%d, %c) = %d
    ",front,String[flag_index],rear);
    
    }
    
    int deal_2(char String[],int front,int rear)
    {
        int flag_index = 0;
        int i = 0;
        int count = 0;
        char x[MAX];
        int temp;
        while(String[i] != '
    ')
        {
            //printf("%c",String[flag_index]);
            if(String[i] == '|')
                InserQ(i++);
            else i++;
        }
        if(Q.rear == Q.front)
        {
            for(i = 0; String[i] != '
    '; i++)
            {
                if(String[i]>='a' && String[i]<='z')
                    count++;
            }
            deal_1(String,front,num + count - 1);
        }
        else
        {
            while(Q.rear != Q.front)
            {
                temp = Gethead();
                cut_string(flag_index,temp-1, String,x);
               // printf("%d",temp);
                num++;
                deal_1(x, front, rear);
                flag_index = temp+1;
            }
            cut_string(flag_index,i, String,x);
            deal_1(x, front, rear);
    
        }
    }
    
    int deal_3(char String[],int front,int rear)
    {
        int flag_index = 0;
        int temp;
        printf("f(%d, ~) = %d
    ",front,++num);
        temp = num;
        if(String[flag_index+2]==')')
        {
            printf("f(%d, %c) = %d
    ",temp,String[1],temp);
        }
        else
        {
            for(flag_index = 0; String[flag_index] != '*'; flag_index++);
            String[flag_index] = '
    ';
            decompose(String);
        }
        printf("f(%d, ~) = %d
    ",temp,rear);
        return front;
    }
    
    void cut_string(int start, int end, char String[], char temp[])
    {
        int i;
        end -= start;
        for(i = 0 ; i <= end ; i++)
        {
            temp[i] = String[start];
            start++;
          //  printf("%c",temp[i]);
        }
    
        temp[i] = '
    ';
        //printf("%d ",i);
       // printf("%c",temp[i]);
    }

      因为时间的关系,所以代码的注释也就没有太在意,望见谅。

  • 相关阅读:
    Best Time to Buy and Sell Stock III
    Valid Palindrome
    Longest Substring Without Repeating Characters
    Copy List with Random Pointer
    Add Two Numbers
    Recover Binary Search Tree
    Anagrams
    ZigZag Conversion
    Merge k Sorted Lists
    Distinct Subsequences
  • 原文地址:https://www.cnblogs.com/lger/p/6186978.html
Copyright © 2011-2022 走看看