一个检查左右括号是否配对的语法检查器(c语言)

一、题目如下

通过键盘输入一个包括 '(' 和 ')' 的字符串string ,判断字符串是否有效。要求设计算法实现检查字符串是否有效,有效的字符串需满足以下条件:

  • A. 左括号必须用相同类型的右括号闭合。
  • B. 左括号必须以正确的顺序闭合。
  • C. 每个右括号都有一个对应的相同类型的左括号。

二、解题思路

设计一个栈容器,循环遍历字符串:

  • 如果遇到‘(’的话则压入栈
  • 如果遇到')'的话,将栈中的‘(’出栈,如果在遇到’)‘时,栈已经清空,说明没有对应的'(',不符合条件
  • 如果字符串遍历完成,栈容器不为空的话,说明有'('没有对应的')'

三、代码实现

/************************************************************************************
 * 设计一个算法,这个算法可以识别某个字符串的左括号是否和对应的右括号闭合,如果全都闭合的话符合条件
 * A.左括号必须用相同类型的右括号闭合。
 * B.左括号必须以正确的顺序闭合。
 * C.每个右括号都有一个对应的相同类型的左括号。
 * Copyright (c)  2024-2025   370591244@qq.com   All right Reserved
************************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

typedef struct StrStack
{
    char *data;
    int size;
    int top;
}Stack_t;

Stack_t *initStack(int size)
{
    //为数据源申请一块合适的内存
    char *str = (char *)calloc(size,sizeof(char));
    if(!str)
    {
        perror("Stack data memory apply failed!");
        exit(-1);
    }

    //为栈结构管理器申请一块栈内存
    Stack_t* manager = (Stack_t*)calloc(1,sizeof(Stack_t));
    if(!manager)
    {
        perror("Stack manager memory apply failed!");
        exit(-1);
    }
    manager->data = str;
    manager->size = size;
    manager->top = -1;
}

// 销毁栈空间
void destoryStack(Stack_t *stack)
{
    free(stack->data);
    free(stack);
}

//压栈
void push(Stack_t *stack, char c)
{
    if(stack->top == stack->size - 1){
        printf("栈空间已满!");
        return;
    }
    stack->data[++stack->top] = c;
}

//出栈
bool pop(Stack_t *stack)
{
    if(stack->top == -1){
        // printf("栈空间已空,出栈失败!\n");
        return false;
    }
    stack->top--;
    return true;
}

void CheckString(char *str,int size)
{
    // 初始化栈空间
    Stack_t *stack = initStack(size);
    for(int i=0; i<strlen(str); i++)
    {
        if(str[i] == '('){
            push(stack,str[i]);
        } 
        else if(str[i] == ')')
        {
            if(!pop(stack))
            {
                printf("不符合条件,存在右括号没有对应的左括号\n");
                return;
            }
        }
    }
    // 如果循环完毕,栈空间为空的话,说明全部闭合;
    if(stack->top == -1) 
    {
        printf("符合条件\n");
    } 
    else
    {
        printf("不符合条件,存在未闭合的左括号\n");
    }
    destoryStack(stack);
}

int main(void)
{
    char str[50];
    printf("请输入一个字符串:\n");
    scanf("%s", str);
    CheckString(str,50);
}

四、测试结果

dada@dada-virtual-machine:~/test$ ./brakets
请输入一个字符串:
(qet))
不符合条件,存在右括号没有对应的左括号
dada@dada-virtual-machine:~/test$ ./brakets
请输入一个字符串:
(djgk)
符合条件
dada@dada-virtual-machine:~/test$ ./brakets
请输入一个字符串:
(iwejt)adf
符合条件
dada@dada-virtual-machine:~/test$ ./brakets
请输入一个字符串:
(dur(lkf)
不符合条件,存在未闭合的左括号
posted @ 2025-03-17 00:18  小镇青年达师傅  阅读(348)  评论(0)    收藏  举报