一个检查左右括号是否配对的语法检查器(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这个东西. 所以,为了保险起见,你最 ...
随机推荐
- 1011. 在 D 天内送达包裹的能力
在 D 天内送达包裹的能力 传送带上的包裹必须在 days 天内从一个港口运送到另一个港口. 传送带上的第 i 个包裹的重量为 weights[i].每一天,我们都会按给出重量(weights)的顺序 ...
- Spring 注解Annotation代替XML实现零配置
1. 使用Spring注解来注入属性1.1. 使用注解以前我们是怎样注入属性的类的实现: public class UserManagerImpl implements UserManager { p ...
- MongoDB:文章评论系统模拟
- ctfshow--web4 include日志注入
这题和第三题有点不一样,这题的把php 和 data 都过滤掉了 一旦我们输入这个关键字就页面就会报error 一开始是没啥头绪的,后面上网查了一下,可以通过日志记录来注入代码 对于Apache,日志 ...
- sql server导入表的一些函数使用
truncate table JC_BMDA; insert into JC_BMDA(bh,mc,qdmc,pym,ty) select right('0'+rtrim(convert(varcha ...
- react声明周期详解
react的生命周期,分为3三个阶段, 挂载阶段 constructor(){} UNSAFE_componentWillMount(){} == componentWillMount(在17版本中将 ...
- 接口性能测试---locust脚本编写(一)
本文分享自天翼云开发者社区<接口性能测试---locust脚本编写(一)>,作者:丁****乐 一.安装 locust是用python编写的一款开源接口性能测试工具,以python3为例, ...
- OI 博弈论若干模型总结(Genshing)
OI博弈论的若干模型 OI 不是知识竞赛. 平等博弈是完全信息的(知道双方目标及操作收益),交替行动的,知道当前局面和转移的,平等(决策和当前状态操作者无关)的. 不平等博弈和上面一致,但是有一方更加 ...
- 为什么TCP需要三次握手?深入解析背后的设计哲学
在互联网通信中,TCP(传输控制协议)是确保数据可靠传输的基石.而TCP连接的建立过程--"三次握手"(Three-Way Handshake),看似简单的三个步骤,却蕴含了网络协 ...
- Ollama 模型迁移备份工具 ollamab
背景 ollama 模型和相关配置文件默认都放在 models 文件夹下,想要把指定模型迁移到其他电脑比较麻烦,所以就有了该工具.还有就是模型下载本身就慢,一次下载多台使用减少下载次数.最重要的是公司 ...