一、题目如下

通过键盘输入一个包括 '(' 和 ')' 的字符串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. nginx平台初探-2

    handler模块简介 相信大家在看了前一章的模块概述以后,都对nginx的模块有了一个基本的认识.基本上作为第三方开发者最可能开发的就是三种类型的模块,即handler,filter和load-ba ...

  2. Codeforces Round 957 (Div. 3)

    题目链接:Codeforces Round 957 (Div. 3) 总结:E不懂,F差一个set去重 A. Only Pluses fag:枚举 B. Angry Monk fag:模拟 Solut ...

  3. AlertWindowManager 弹出提示窗口

    LookAndFeel(界面外观): NativeStyle:本地化界面为真实用系统内置外观 SkinName:本地化界面(NativeStyle:)设置为假可使用皮肤外观 OptionAnimate ...

  4. 天翼云CDR基本概念

    本文分享自天翼云开发者社区<天翼云CDR基本概念>,作者:f****n 产品定义 云容灾CT-CDR(Cloud Disaster Recovery)为云主机提供跨可用区的容灾保护能力,R ...

  5. [业界方案] Yarn的业界解决方案和未来方向

    [业界方案] Yarn的业界解决方案和未来方向 目录 [业界方案] Yarn的业界解决方案和未来方向 0x00 摘要 0x01 Yarn 1.1 参考文章 0x02 分析 2.1 综述 2.1.1 y ...

  6. mac电脑安装python配置系统环境变量

    首先安装对应的python版本 这边我安装的是python3.11.6版本 安装包地址:macOS 64-bit universal2 installer 安装包安装完成之后执行该安装包 一直点击继续 ...

  7. [luogu4114] Qtree1 题解

    \(LCT\) 动态维护树上路径最值,典中典了. 时间复杂度 \(O(n\log n)\). #include<bits/stdc++.h> #define fa(x) lct[x].fa ...

  8. vscode开发小程序2

    开发tab: 1.下载阿里图标到新建文件夹icons里面 2.在app.json里面的"windows"同层下设置tab: 默认样式的设置:小程序中不识别通配符*! 1. 2.查看 ...

  9. 雷电4扩展坞HDMI显示器无法睡眠问题

    背景: 最近使用Dell的雷电4扩展坞WD22TB4,感觉很爽,取电脑时,不用再拔显示器.鼠标.键盘,直接把雷电4接口拔出即可. 后来通过windows update升级了intel显卡驱动后,发现电 ...

  10. autMan奥特曼机器人-内置wx机器人的相关说明

    内置wx机器人的相关说明 内置wxbot机器人,经常有人说在群内无回复,做以下几个工作: 给群命名 通过机器人微信APP将此群加入到通讯录 重启autMan 内置微信机器人已经支持群名设置 例如转发时 ...