栈的应用:左右符号匹配

来源:互联网 发布:matlab 三维矩阵 画图 编辑:程序博客网 时间:2024/06/06 20:51

说明:

  1. 在编译器中,都有这么一个左右符号匹配的功能,这里通过栈来模拟实现这一功能;

  2. 这里采用了代码复用的方法,即使用了LinkStack链栈,详见数据结构封装之《LinkStack链栈》;


代码:

main.c

#include <stdio.h>    #include <stdlib.h>    #include "LinkStack.h"    //判断是否为左符号    int isLeft(char c)    {        int ret = 0;        switch(c)        {            case '<':            case '(':            case '[':            case '{':            case '\'':            case '\"':                ret = 1;                break;            default:                ret = 0;                break;        }        return ret;    }    //判断是否为右符号    int isRight(char c)    {        int ret = 0;        switch(c)        {            case '>':            case ')':            case ']':            case '}':            case '\'':            case '\"':                ret = 1;                break;            default:                ret = 0;                break;        }        return ret;    }    //匹配左右符号是否一对    int match(char left, char right)    {        int ret = 0;        switch(left)        {            case '<':                ret = (right == '>');                break;            case '(':                ret = (right == ')');                break;            case '[':                ret = (right == ']');                break;            case '{':                ret = (right == '}');                break;            case '\'':                ret = (right == '\'');                break;            case '\"':                ret = (right == '\"');                break;            default:                ret = 0;                break;        }        return ret;    }    //左右符号匹配逻辑    int scanner(const char* code)    {        LinkStack* stack = LinkStack_Create();        int ret = 0;        int i = 0;        while( code[i] != '\0' )        {            if( isLeft(code[i]) )//左符号,则压栈            {                LinkStack_Push(stack, (void*)(code + i));            }//end 1 if            if( isRight(code[i]) )            {                char* c = (char*)LinkStack_Pop(stack);//弹出的左符号                if( (c == NULL) || !match(*c, code[i]) )//判断弹出的左符号是否与右符号相匹配                {                    printf("%c does not match!\n", code[i]);                    ret = 0;                    break;                }            }//end 2 if            i++;        }        if( (LinkStack_Size(stack) == 0) && (code[i] == '\0') )//栈为空时,切字符串到结尾时,则成功        {            printf("Succeed!\n");            ret = 1;        }        else        {            printf("Invalid code!\n");            ret = 0;        }        LinkStack_Destroy(stack);        return ret;    }    int main(int argc, char *argv[])    {        const char* code = "#include <stdio.h> int main() { int a[2][5]; int (*p)[3]; p = a[0]; printf(\"%d\\n\", &p[2][3] - &a[1][3]); return 0; }";        scanner(code);        return 0;    }

函数结构分析:

1.isLeft

2.isRight

3.match

4.scanner

原创粉丝点击