一个检查左右括号是否配对的语法检查器(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)
不符合条件,存在未闭合的左括号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/900059.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于编码转换问题

今天我在写攻防世界的“no-strings-attached”这道题的时候,在处理16进制字符串序列转10进制整数的时候出现了问题,这个问题是关于“utf-8”对某些字节值进行特殊处理导致的。具体情况如下: 首先是我提取的两个16进制字符序列然后我对其进行小端序的进制转换操作,操作如下:…

一点点矩阵

矩阵置0//O(m*n) O(m+n) var setZeroes = function(matrix) {let row=[]let col=[]let n=matrix.lengthlet m=matrix[0].lengthfor(let i=0;i<n;i++){for(let j=0;j<m;j++){if(matrix[i][j]==0){row.push(i)col.push(j)}}}for(let i of row){for(let j=0;j<m;j++){mat…

基于DVB-T的COFDM+16QAM+Viterbi编解码图传通信系统matlab仿真,包括载波定时同步,信道估计

1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印):仿真操作步骤可参考程序配套的操作视频。2.算法涉及理论知识概要基于DVB-T的COFDM+16QAM+Viterbi编解码通信链路是一种常用的数字视频广播系统,用于实现高效的传输和接收。该系统结合了正交频分复用(COFDM)…

Day15_http协议

每日一题 面试题: 请解释以下问题:HTTP/2 的主要改进有哪些?与 HTTP/1.1 相比,它如何解决“队头阻塞”问题? HTTPS 是如何实现数据加密的?详细说明 TLS 握手过程。 HTTP/3 为什么选择基于 UDP 的 QUIC 协议?它解决了哪些传统 TCP 协议的缺陷?解答: 1. HTTP/2 的改进与…

基于双PI控制的永磁同步电机变频调速系统simulink建模与仿真

1.课题概述 基于双PI控制的永磁同步电机变频调速系统simulink建模与仿真。2.系统仿真结果 (完整程序运行后无水印)3.核心程序与模型 版本:MATLAB2022a4.系统原理简介基于双PI控制的永磁同步电机(PMSM)变频调速系统是一种高效的电机控制策略,它利用两个独立的PI控制器分别控…

DeepSeek+Claude强强联手,使用AI驱动DjangoStarter 3.1框架升级

前言 上个月底培训了一周就没时间更新博客 上周有一些空闲时间,就继续体验最近很火的AI辅助编程 之前的文章中有说到我配置好了 VSCode + Cline 插件搭配本地部署的 DeepSeek 来实现AI辅助编程参考: 开发者新选择:用DeepSeek实现Cursor级智能编程的免费方案但 Cline 插件消耗…

20243426 实验一《Python程序设计》实验报告

课程:《Python程序设计》 班级: 2434 姓名: 樊泽睿 学号:20243426 实验教师:王志强 实验日期:2025年3月12日 必修/选修: 公选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能;(编写书中的程序,并进行调试分析,要有过程) 3.编写程序,练习变量…

第01章 数据库概述

第01章 数据库概述 1. 为什么要使用数据库持久化 (Persistence): 把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以“固化”,而持久化的实现过程大多通过各种关系数据库来完成。 持久化的主要作…

【每日一题】20250316

【每日一题】曲线 \(\displaystyle y=3(x^2+x-\sqrt{4x^2+3})e^{-2x^2}\) 在点 \((-1,0)\) 处的切线方程为_________.如图所示,取一段长为 \(12\) 的绳子,如果把这段绳子的两个端点分别固定在画图板上不同的两点 \(F_1\) 和 \(F_2\) 处,当绳长大于 \(F_1\) 和 \(F_2\) 之间…

foobar2000 v2.24.3 汉化版

foobar2000 v2.24.3 汉化版 -----------------------【软件截图】---------------------- -----------------------【软件介绍】---------------------- foobar2000 是一个 Windows 平台下的高级音频播放器.包含完全支持 unicode 及支持播放增益的高级标签功能. 特色: * 支持的…

拉格朗日插值算法

首先介绍下作用 在平面上给定 n 个点,求一条多项式图像穿过所有的点 (每个点横坐标不同)由浅入深,首先想一个悬浮点 1 ,它在除 1 以外给定的点的横坐标上函数值都是 0 。已知它的横坐标 \(x_1\) , 怎么用函数图像表示 我们一拍脑袋发现,可以这么表示 \[f1(x) = \prod_{i =…

本地部署Gemma3模型

本地部署Gemma3模型 1. 拉取并运行 Ollama 容器 # 拉取 Ollama 镜像 docker pull ollama/ollama# 运行 Ollama 容器 docker run -d --gpus all -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama2. 进入容器并部署 Gemma3 模型(默认4B版 ) # 进入 Ollama 容…