一、题目如下

通过键盘输入一个包括 '(' 和 ')' 的字符串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)
不符合条件,存在未闭合的左括号

一个检查左右括号是否配对的语法检查器(c语言)的更多相关文章

  1. 一个简单的C语言语法检查器的实现

    我自己的实现方法的核心过程:首先用一个非终结符代表所有要检查的程序代码,然后根据文法将这个整体的符号不断展开,以拼凑成按检查的程序的顺序排列的终结符序列,能成功说明语法正确,否则有错误. 关键词:分词 ...

  2. 【转】Word 2010 取消拼写/语法检查,隐藏红线/绿线

    转自:http://blog.chinaunix.net/uid-8203698-id-3040631.html 设置方法如下,在Word菜单栏-->文件-->选项-->校对,其中“ ...

  3. 9.9递归和动态规划(六)——打印n对括号的所有有效组合(即左右括号正确配对)

    /**  * 功能:打印n对括号的所有有效组合(即左右括号正确配对). */ 两种方法: 方法一: /** * 思路:在括号的最前面或者原有的每对括号中面插入一对括号. 至于其它任何位置.比方字符串的 ...

  4. ECMAScript6语法检查规范错误信息说明

    项目中使用ECMAScript6的时候经查会使用语法检查,下面是常见错误信息的汇总: “Missing semicolon.” : “缺少分号.”, “Use the function form of ...

  5. 自己写个 Drools 文件语法检查工具——栈的应用之编译器检测语法错误

    一.背景 当前自己开发的 Android 项目是一个智能推荐系统,用到 drools 规则引擎,于我来说是一个新知识点,以前都没听说过的东东,不过用起来也不算太难,经过一段时间学习,基本掌握.关于 d ...

  6. Grunt 之 使用 JavaScript 语法检查工具 jshint

    前端开发环境准备好了,我们准备开始进行开发. 前端开发的主力语言是 JavaScript,这是一种脚本语言,没有编译器,也就没有了编译器带给我们的语法检查,怎样保证代码的质量呢?jshint 是一个强 ...

  7. MySQL递归查询_函数语法检查_GROUP_CONCAT组合结果集的使用

    1-前言: 在Mysql使用递归查询是很不方便的,不像Sqlserver可以直接使用声明变量,使用虚拟表等等.如:DECLARE,BEGIN ...  END   ,WHILE ,IF 等等. 在My ...

  8. IE push方法,最后一个参数后面不能跟",",否则报语法错误

    var columns = [[]]; columns[0].push( { field: 'ADDNAME', title: '添加人', width: 80, }, { field: 'ADDDT ...

  9. golang使用vet进行语法检查

    go tool vet是你的好朋友,不要忽视它. vet是一个优雅的工具,每个Go开发者都要知道并会使用它.它会做代码静态检查发现可能的bug或者可疑的构造.vet是Go tool套件的一部分,我们会 ...

  10. Vim中异步语法检查ale配置

    注意 在设置let g:ale_sign_error = '✗'和let g:ale_sign_warning = '⚡'这些时,可能vim不让你保存,提示fenc这个东西. 所以,为了保险起见,你最 ...

随机推荐

  1. springBoot(2)--初步理解

    一.定时任务 1.步骤: 1:在启动类上写@EnableScheduling注解 2:在要定时任务的类上写@component 3:在要定时执行的方法上写@Scheduled(fixedRate=毫秒 ...

  2. 第一个helloworld,有点小兴奋

      @SpringBootApplication package com.ch.boot; import org.springframework.boot.SpringApplication; imp ...

  3. js脚本实现文本文件格式批量转换

    问题: 在Windows环境下,从某些软件中导出的文本格式的数据,选择了默认的ANSI格式.双击打开数据文件后,一切正常,没乱码问题.但是为什么自己的代码里,先按照ANSI格式打开,在转换为UTF8, ...

  4. Win10部分软件程序中输入中文变成问号??如何处理【详细步骤】

    近期在win10系统中,出现了一个问题,那就是在部分程序软件中输入中文之后,会直接显示问号,哪怕是更换输入法也没有任何用.那么遇到这个问题,我们要如何处理呢?下面IT百科分享一下Win10系统部分软件 ...

  5. 小程序image图片缩小不变形

    使用mode =aspectFill 值 说明 scaleToFill 缩放模式,不保持纵横比缩放图片,使图片的宽高完全拉伸至填满 image 元素 图片会变形 aspectFit 缩放模式,保持纵横 ...

  6. 从一指禅到无重复字符:最长子串问题的优雅解法|LeetCode 3 无重复字符的最长子串

    LeetCode 3 无重复字符的最长子串 点此看全部题解 LeetCode必刷100题:一份来自面试官的算法地图(题解持续更新中) 生活中的算法 你是否玩过"一指禅"游戏?就是沿 ...

  7. Windows&Mac解决端口占用问题

    Windows解决端口占用问题 1.打开命令窗口(以管理员身份运行) 以管理员方式打开cmd 2.查找所有运行的端口 我这里运行了一个项目127.0.0.1:5000,使用的是5000端口,以此来做示 ...

  8. C#下.NET配置文件的使用(1)

    原文链接:https://blog.csdn.net/dbzhang800/article/details/7212420 System.Configuration 命名空间中的东西是为读写应用程序的 ...

  9. Google 助手安装

    转自:https://www.jianshu.com/p/6086ec29c173 今天这篇推送可能是很多人都需要的,因为它能帮助你无阻碍的访问Google.Google scholar.Gmail. ...

  10. vue - [04] 配置

    关闭ESLint. 001 || ESLint (1)定义   ESLint是一个插件化的JavaScript代码检查工具.在vue项目中,它可以检查.vue文件中的JavaScript代码(包括脚本 ...