ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

用移进--规约给出对输入串abbcde#的分析过程

2020-05-03 13:51:16  阅读:478  来源: 互联网

标签:Sqstack 移进 top ++ abbcde char 规约 base printf


#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define MAXSIZE 100
typedef struct{
    char *base;
    char *top;
}Sqstack;

//手动构造预测分析表  42个字符串
char* str[5][7]={" " , "a"  , "b" , "c" , "d" , "e" , "#" ,
                 "S" , "aAcBe" , " " , " " , " " , " " , " ",
                 "A" , " " , "bH" , " " ," " , " " ," ",
                 "H" , " " , "bH" , "k" , " " , " " , " ",
                 "B" , " " , " " , " " , "d" , " " , " ",
                };


/*初始化顺序栈*/
void Creatstack(Sqstack &S)
{
    S.base = new char[MAXSIZE];/*base指向第0个元素*/
    S.top = S.base;
}

/*判断栈是否为空*/
int stackempty(Sqstack &S)
{
    if(S.base == S.top)
        return 1;
    else
        return 0;
}

/*入栈*/
void push(Sqstack &S,char e)
{
    *S.top++ = e;
}

/*出栈*/
void pop(Sqstack &S)
{
    --S.top;
}

/*获取栈顶元素*/
char gettop(Sqstack &S)
{
    --S.top;
    return *S.top;

}

/*把栈里的内容输出*/
void showstack(Sqstack &S)
{
    int i = 0;//记步
    while(S.top != S.base)
    {
        printf("%c",*S.base);
        S.base++;
        i++;
    }
    //把栈还原成原来的样子
    while(i != 0)
    {
        S.base--;
        i--;
    }
}

void showinput(char *p)
{
    int i = 0;
    while(*p != '\0')
    {
        printf("%c ",*p);
        p++;
        i++;
    }
    //将p指向原来的位置
    while(i != 0)
    {
        p--;
        i--;
    }
}

void main()
{
    
    int test = 0;
    //建立栈
    Sqstack S;
    char ch;
    char *p;
    char *s;
    int i,j;
    int a,b;
    int z;
    int k;
    //要验证的i+i*i
    char *input = "abbcde#";
    p = input;
    Creatstack(S);

    printf("\n");
    //将#入栈
    push(S,'#');
    //文法开始符入栈
    push(S,'S');
    while(S.base != S.top)
    {

        showstack(S);
        printf("                  ");
        showinput(p);
        printf("                  ");
        
        //找栈顶元素的和输入串的首元素
        ch = gettop(S);
        //获取之后还要还原
        S.top++;
        
        if(ch == *p && *p != '\0')
        {
            pop(S);
            p++;
            printf("匹配成功");
            printf("\n");
        }
        
        else{
                for(i = 0;i < 5;i++)
                {
                    
                    if(*str[i][0] == ch) 
                    {
                        a = i;
                    }
                }
                
                for(j = 0;j < 7;j++)
                {
                    
                    if(*str[0][j] == *p) 
                    {
                        b = j;            
                    }
                }
                
                if(str[a][b] == "k")
                {
                    pop(S);
                }
                else
                {
                    pop(S);
                    //逆序
                    s = str[a][b];
                    z = 0;
                    while(*s != '\0')
                    {
                        s++;
                        z++;
                    }
                    s--;
                    //z--;
                    while(z != 0)
                    {
                        push(S,*s);
                        s--;
                        z--;
                    }
                    
                }
                printf("%c -> %s \n",ch,str[a][b]);//find  
        }
    }
}

显示结果:

#S                  a b b c d e #                   S -> aAcBe
#eBcAa                  a b b c d e #                   匹配成功
#eBcA                  b b c d e #                   A -> bH
#eBcHb                  b b c d e #                   匹配成功
#eBcH                  b c d e #                   H -> bH
#eBcHb                  b c d e #                   匹配成功
#eBcH                  c d e #                   H -> k
#eBc                  c d e #                   匹配成功
#eB                  d e #                   B -> d
#ed                  d e #                   匹配成功
#e                  e #                   匹配成功
#                  #                   匹配成功
Press any key to continue

 

标签:Sqstack,移进,top,++,abbcde,char,规约,base,printf
来源: https://www.cnblogs.com/lintianxiajun/p/12821751.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有