一个检查左右括号是否配对的语法检查器(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)
不符合条件,存在未闭合的左括号
一个检查左右括号是否配对的语法检查器(c语言)的更多相关文章
- 一个简单的C语言语法检查器的实现
我自己的实现方法的核心过程:首先用一个非终结符代表所有要检查的程序代码,然后根据文法将这个整体的符号不断展开,以拼凑成按检查的程序的顺序排列的终结符序列,能成功说明语法正确,否则有错误. 关键词:分词 ...
- 【转】Word 2010 取消拼写/语法检查,隐藏红线/绿线
转自:http://blog.chinaunix.net/uid-8203698-id-3040631.html 设置方法如下,在Word菜单栏-->文件-->选项-->校对,其中“ ...
- 9.9递归和动态规划(六)——打印n对括号的所有有效组合(即左右括号正确配对)
/** * 功能:打印n对括号的所有有效组合(即左右括号正确配对). */ 两种方法: 方法一: /** * 思路:在括号的最前面或者原有的每对括号中面插入一对括号. 至于其它任何位置.比方字符串的 ...
- ECMAScript6语法检查规范错误信息说明
项目中使用ECMAScript6的时候经查会使用语法检查,下面是常见错误信息的汇总: “Missing semicolon.” : “缺少分号.”, “Use the function form of ...
- 自己写个 Drools 文件语法检查工具——栈的应用之编译器检测语法错误
一.背景 当前自己开发的 Android 项目是一个智能推荐系统,用到 drools 规则引擎,于我来说是一个新知识点,以前都没听说过的东东,不过用起来也不算太难,经过一段时间学习,基本掌握.关于 d ...
- Grunt 之 使用 JavaScript 语法检查工具 jshint
前端开发环境准备好了,我们准备开始进行开发. 前端开发的主力语言是 JavaScript,这是一种脚本语言,没有编译器,也就没有了编译器带给我们的语法检查,怎样保证代码的质量呢?jshint 是一个强 ...
- MySQL递归查询_函数语法检查_GROUP_CONCAT组合结果集的使用
1-前言: 在Mysql使用递归查询是很不方便的,不像Sqlserver可以直接使用声明变量,使用虚拟表等等.如:DECLARE,BEGIN ... END ,WHILE ,IF 等等. 在My ...
- IE push方法,最后一个参数后面不能跟",",否则报语法错误
var columns = [[]]; columns[0].push( { field: 'ADDNAME', title: '添加人', width: 80, }, { field: 'ADDDT ...
- golang使用vet进行语法检查
go tool vet是你的好朋友,不要忽视它. vet是一个优雅的工具,每个Go开发者都要知道并会使用它.它会做代码静态检查发现可能的bug或者可疑的构造.vet是Go tool套件的一部分,我们会 ...
- Vim中异步语法检查ale配置
注意 在设置let g:ale_sign_error = '✗'和let g:ale_sign_warning = '⚡'这些时,可能vim不让你保存,提示fenc这个东西. 所以,为了保险起见,你最 ...
随机推荐
- 【Git】fatal: refusing to merge unrelated histories
git pull origin master --allow-unrelated-histories
- G1原理—10.如何优化G1中的FGC
大纲 1.G1的FGC可以优化的点 2.一个bug导致的FGC(Kafka发送重试 + subList导致List越来越大) 3.为什么G1的FGC比ParNew + CMS要更严重 4.FGC的一些 ...
- LESLIE NOTE ——你的笔记只属于你自己
LESLIE NOTE 网站:http://www.leslienote.com 简介: [只有数据可控,才是最放心的] [只有多多备份,才是最安全的] LESLIE NOTE 是一款本地笔记软件, ...
- JUC并发—6.AQS源码分析二
大纲 1.ReentractReadWriteLock的基本原理 2.基于AQS实现的ReentractReadWriteLock 3.ReentractReadWriteLock如何竞争写锁 4.R ...
- [BZOJ3159] 决战 题解
个人感觉各方面难度高于<在美妙的数学王国中畅游>,也不知道是不是求导的关系,这题 \(luogu\) 难度评级还更低.不过感觉这题作完对 \(LCT\) 理解更顺畅了. 前四个操作简单,关 ...
- mybatis - [08] mybatis-config.xml 详解
mybatis-config.xml中的标签需要按照一定顺序配置,否则会有以下提示. configuration(配置) properties(属性) settings(设置) typeAliases ...
- 让 LLM 来评判 | 设计你自己的评估 prompt
设计你自己的评估 prompt 这是 让 LLM 来评判 系列文章的第三篇,敬请关注系列文章: 基础概念 选择 LLM 评估模型 设计你自己的评估 prompt 评估你的评估结果 奖励模型相关内容 技 ...
- 读论文-基于会话的推荐系统综述(A survey on session-based recommender systems)
前言 今天读的论文是一篇于2021年发表于"ACM Computing Surveys (CSUR)"的论文,文章写到,推荐系统在信息过载时代和数字化经济中非常重要.基于会话的推荐 ...
- swoole(5)信号监听、热重启
一:信号监听 信号:由用户.系统或者进程发给目标进程的信息,以通知目标进程某个状态的改变或系统异常 信号查看:kill -l SIGHUP 终止进程 终端线路挂断 SIGINT ...
- RP 点归入Set And Coupling 约束创建
想用python脚本创建一个耦合coupling关系,需要定义control piont和被控制的surfaces.两者都可以先分别归入到set 和surface里,最后用set和surface作为c ...