一、题目如下

通过键盘输入一个包括 '(' 和 ')' 的字符串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. atomic 包底层实现原理

    一.概念介绍(一)volatile关键字 Java 因为指令重排序,优化我们的代码,让程序运行更快,也随之带来了多线程下,指令执行顺序的不可控. 1.volatile关键字的作用: 内存可见性,修饰的 ...

  2. kafka的server.properties文件描述

    版本:基于 kafka 2.4.0  http://archive.apache.org/dist/kafka/2.4.0/kafka_2.11-2.4.0.tgz # Licensed to the ...

  3. 边缘计算与MEC浅谈

    本文分享自天翼云开发者社区<边缘计算与MEC浅谈>,作者:y****n 一.什么是边缘计算 边缘计算是在靠近物或数据源头的网络边缘侧,通过融合网络.计算.存储.应用核心能力的分布式开放平台 ...

  4. MySql中创建用户以及设置其操作权限

    以下设置针对MySql8+版本进行测试,低版本暂无测试. 以管理员身份CMD并定位到MySql安装的bin目录,然后执行命令mysql -u root -p登录到MySql,然后输入登录密码,登录成功 ...

  5. Q:如何在Linux系统中查看实时网卡流量

    Linux查看实时网卡流量的几种方式 来源  https://www.jianshu.com/p/b9e942f3682c 在工作中,我们经常需要查看服务器的实时网卡流量.通常,我们会通过这几种方式查 ...

  6. Q:su命令无法切换用户问题,密码正确可登录

    一.文件权限问题 查看文件权限: ll -a /bin/su /usr/bin/passwd 正确的结果为: 错误的结果为: suid和普通x执行权限 s:当普通用户使用su的时候,采用的是owner ...

  7. C# 程序流控制 条件语句

    C#语言最基本的重要语句:控制程序流的语句.它们不是按代码在程序中的排列位置顺序执行的. 条件语句 条件语句可以根据条件是否满足或根据表达式的值来控制代码的执行分支.C#有两个控制代码的分支结构: i ...

  8. RocketMQ实战—9.营销系统代码初版

    大纲 1.基于条件和画像筛选用户的业务分析和实现 2.全量用户促销活动数据模型分析以及创建操作 3.Producer和Consumer的工程代码实现 4.基于抽象工厂模式的消息推送实现 5.全量用户促 ...

  9. 删除binlog日志

    手动删除 在备库检查正在使用的binlog SHOW REPLICA STATUS 在主库获取binlog列表 SHOW BINARY LOGS 删除备库使用前或主库正在写入前的binlog 不要将正 ...

  10. intellij debug模式提示 Method breakpoints may dramatically slow down debugging 解决办法

    直接上图........ 点击图中按钮  或者 快捷键(Ctrl - Shift -F8 ) 出现下图