【数据结构】括号匹配的检验C语言

算法

算法:
-遇到普通字符忽略

  • 遇到左括号入栈
  • 遇到右符号 从栈中弹出栈顶符号,比配
    • 匹配成功,继续扫描
    • 匹配失败,停止,报错
      结束:
  • 所有字符扫描完毕,栈为空:成功
  • 匹配失败或扫描完毕,但是栈不为空:失败

代码

//
// Created by xuehu96 on 2019-08-09.
//
#include <stdio.h>
#include "../linkstack.h"

int isLeft(const char c)
{
    int ret = 0;
    switch(c)
    {
        case '(':
        case '<':
        case '[':
        case '{':
        case '\'':
        case '\"':
            ret = 1;
            break;
        default:
            ret = 0;
    }
    return ret;
}

int isRight(const char c)
{
    int ret = 0;
    switch(c)
    {
        case ')':
        case '>':
        case ']':
        case '}':
        case '\'':
        case '\"':
            ret = 1;
            break;
        default:
            ret = 0;
    }
    return ret;
}

int match(const char left, const char right)
{
    switch(left)
    {
        case '(':
            return (right == ')');
        case '<':
            return (right == '>');
        case '[':
            return (right == ']');
        case '{':
            return (right == '}');
        case '\'':
            return (right == '\'');
        case '\"':
            return (right == '\"');
        default:
            return 0;
    }
}

void matchErr(const char *str, int pos)
{
    printf ("Error: braces does not match at position: %d \n", pos);
    printf ("%s\n", str);
    for(int i = 0; i < pos; ++i)
    {
        printf (" ");
    }
    printf ("^\n");
}

int scanner(const char *code)
{
    int i = 0,ret = 0;

    LinkStack *stack = NULL;
    stack = LinkStack_Create ();

    while(code[i] != '\0')
    {
        if(isLeft (code[i]))
        {
            LinkStack_Push (stack, (void *) &code[i]);
        }
        if(isRight (code[i]))
        {
            if(LinkStack_Size (stack) == 0)
            {
                matchErr (code, i);
                LinkStack_Destroy (stack);
                return 0;
            }
            char *tmp = (char *) LinkStack_Pop (stack);
            if((!match (*tmp, code[i])) || (tmp == NULL))
            {
                matchErr (code, i);
                LinkStack_Destroy (stack);
                return 0;
            }
        }
        i++;
    }

    if(code[i] == '\0' && LinkStack_Size (stack) == 0)
    {
        ret = 1;
    }
    else if(LinkStack_Size (stack) != 0)
    {
        matchErr (code, i);
        ret = 0;
    }
    else
    {
        printf ("Fail match:err\n");

    }

    LinkStack_Destroy (stack);

    return ret;
}

/*算法:
 * 遇到普通字符忽略
 * 遇到左括号入栈
 * 遇到右符号 从栈中弹出栈顶符号,比配
 *      匹配成功,继续扫描
 *      匹配失败,停止,报错
 * 结束:
 *      所有字符扫描完毕,栈为空:成功
 *      匹配失败或扫描完毕,但是栈不为空:失败
 * */

int demo_matchingSymbol()
{
    //const char *code = "#include stdio.h> int main(){int a[4][4]; int (*p)4[];p = a[0]; return 0;}";
    const char *code = "typedef struct M  { int B  ;   int C;   unsigned int  ** D ; } A;L* SeqList_Create\n";
    if(scanner (code))
    {
        printf ("success\n");
    }
    return 0;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的C语言代码,用于检验括号匹配: ``` #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 1000 typedef struct { char data[MAX_SIZE]; int top; } Stack; void init(Stack *s) { s->top = -1; } void push(Stack *s, char c) { if (s->top == MAX_SIZE - 1) { printf("Error: stack overflow!\n"); exit(1); } else { s->data[++(s->top)] = c; } } char pop(Stack *s) { if (s->top == -1) { printf("Error: stack underflow!\n"); exit(1); } else { return s->data[(s->top)--]; } } int is_empty(Stack *s) { return (s->top == -1); } char peek(Stack *s) { if (s->top == -1) { printf("Error: stack underflow!\n"); exit(1); } else { return s->data[s->top]; } } int is_matching_pair(char left, char right) { if (left == '(' && right == ')') { return 1; } else if (left == '{' && right == '}') { return 1; } else if (left == '[' && right == ']') { return 1; } else { return 0; } } int check_matching_parenthesis(char *exp) { Stack s; init(&s); for (int i = 0; exp[i] != '\0'; i++) { if (exp[i] == '(' || exp[i] == '{' || exp[i] == '[') { push(&s, exp[i]); } else if (exp[i] == ')' || exp[i] == '}' || exp[i] == ']') { if (is_empty(&s) || !is_matching_pair(peek(&s), exp[i])) { return 0; } else { pop(&s); } } } return (is_empty(&s) ? 1 : 0); } int main() { char exp[MAX_SIZE]; printf("Enter an expression: "); scanf("%s", exp); if (check_matching_parenthesis(exp)) { printf("Expression is balanced.\n"); } else { printf("Expression is not balanced.\n"); } return 0; } ``` 该代码使用一个来存储左括号。当遇到左括号时,将其推入中。当遇到右括号时,检查是否为空,并且检查右括号是否与顶元素的左括号匹配。如果匹配,则将顶元素弹出,继续处理下一个字符。如果不匹配,则表达式不平衡。最后,如果为空,则表达式平衡,否则表达式不平衡。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值