栈的应用:左右符号匹配

说明:

  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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值