c语言中 各种括号应成对出现,C语言::验证花括号成对出现

题目要求

编写一个程序,它从标准输入(终端)读取C源代码,并验证所有的花括号都正确的成对出现。

注意:你不必担心注释内部、字符串常量内部和字符常量形式的花括号。

算法分析

我们先判断左花括号的数量是否相等。

如果左右花括号数量不等,肯定不成对!

如果左右花括号数量相等,一定就成对吗???

好像也不一定。

我们来举例分析一下,左右花括号相等时可能会出现的情况:

1.{{{{{}}}}}(匹配)

2.{}{}{}{}{}(匹配)

...

3.}}}}}{{{{{(不匹配)

4.{{{{}}}}}{(不匹配)

......

第1种情况和第2种情况,属于左右花括号数目相等且匹配的情况,所以我们不用分析。

第3种情况和第4种情况,属于左右花括号数目相等但不匹配的情况,因此我们需要找出它们的共同点.

稍加分析我们就可以得出以下结论:

当右花括号出现时,如果左花括号的数目小于右花括号数目时,左右花括号必然不匹配.

可能有人对以上结论不理解,在此我再来详细解释一下:

(如果你表示已理解结论,请直接跳转算法总结部分)

我们先来分析情况3:

当我们看到第一个右花括号时,发现它前面并没有左花括号.

因此情况3必然属于左右花括号不匹配的情况.

我们再来分析情况4:

我们看第1个右花括号,发现它前面有4个左花括号;

第2个右花括号,前面有4个左花括号

......

直到第5个右花括号,前面只有4个左花括号.

因此情况3也属于左右花括号不匹配的情况.

算法总结

根据上面的分析,我们得出如下结论:

判断左右花括号是否成对出现需要两个条件:

1.左右花括号数目必须相等.

2.当右花括号出现时,左花括号数目必须大于右花括号.

算法转程序

根据题目要求,首先我们需要从标准输入获得数据。

(不清楚这些函数功能的童鞋请直接点击函数名称)

scanf()函数和gets()函数都需要指定一个字符数组来做存储。

如果用这两个函数的话,那就必须得定义一个字符数组。

定义字符数组的话又会面临数组溢出或者浪费空间等问题。

(数组定义小了,可能会溢出;定义大了,又会浪费空间.)

而getchar()函数每次只能从控制台接受一个字符,因此我们需要用循环来操作。

所以,我们用getchar()函数通过循环操作,从标准输入获得数据。

于是便可以完成这样的代码:

//定义一个整型变量用来接收控制台数据

int ch = 0;

//提示信息

printf("请输入一段字符以ctrl+z结束:\n");

//从控制台读入字符并判断是否满足循环条件。

while((ch=getchar())!=EOF){

...//判断左右花括号是否匹配的代码

}

接下来我们开始写分析左右花括号是否匹配的代码。

根据,算法总结,我们可以设置两个int型变量left和right,分别用来记录左花括号的数量和右花括号的数量。

如果遇到左花括号,则left++;

如果如果遇到右花括号,我们首先得判断左花括号的数目是否大于右花括号,right++;否则直接退出。

//定义一个整型变量用来接收控制台数据

int ch = 0;

//定义一个整型变量用来计算左花括号数目

int left = 0;

//定义一个整型变量用来计算右花括号数目

int right = 0;

//提示信息

printf("请输入一段字符以ctrl+z结束:\n");

//从控制台读入字符并判断是否满足循环条件。

while((ch=getchar())!=EOF){

//遇到左花括号,left+1

if(ch==’{’){

left++;

}

//遇到右花括号

if(ch==’}’){

//左花括号数目大于右花括号数目right+1

if(left>right){

right++;

}else{

//否则就是这种情况

//{{{{}}}}}{

//}}}}}{{{{{

//.....

//直接退出程序

printf("不匹配!\n");

return 0;

}

}

}

//如果程序能走到这里

//就已经排除}}}}{{{{这种特殊情况

//如果左花括号数目等于右花括号数目

if(right==left){

printf("匹配!\n");

}else{

printf("不匹配!\n");

}

最终的完整的代码如下:

#include

int main(){

//定义一个整型变量用来接收控制台数据

int ch = 0;

//定义一个整型变量用来计算左花括号数目

int left = 0;

//定义一个整型变量用来计算右花括号数目

int right = 0;

//提示信息

printf("请输入一段字符以ctrl+z结束:\n");

//从控制台读入字符并判断是否满足循环条件。

while((ch=getchar())!=EOF){

//遇到左花括号,left+1

if(ch==’{’){

left++;

}

//遇到右花括号

if(ch==’}’){

//左花括号数目大于右花括号数目right+1

if(left>right){

right++;

}else{

//否则就是这种情况

//{{{{}}}}}{

//}}}}}{{{{{

//.....

//直接退出程序

printf("不匹配!\n");

return 0;

}

}

}

//如果程序能走到这里

//就已经排除}}}}{{{{这种特殊情况

//如果左花括号数目等于右花括号数目

if(right==left){

printf("匹配!\n");

}else{

printf("不匹配!\n");

}

return 0;

}

程序优化

写到这里,好像就已经结束了?

其实....并没有!

在上述程序中,我们用了两个变量left和right来记录左右花括号数目。

其实,我们并不需要知道left和right具体的值.

因此,我们可以用一个变量来记录左右花括号的状态.

我们定义一个整型变量count.

如果遇到左花括号,count++;

如果遇到右花括号,判断count是否大于0,如果是count--,否则直接退出.

最终代码如下:

#include

int main(){

//定义一个整型变量用来接收控制台数据

int ch = 0;

//定义一个整型变量用来记录左右花括号的状态

int count = 0;

//提示信息

printf("请输入一段字符以ctrl+z结束:\n");

//从控制台读入字符并判断是否满足循环条件。

while((ch=getchar())!=EOF){

//遇到左花括号,count++

if(ch==’{’){

count++;

}

//遇到右花括号

if(ch==’}’){

//左花括号数目大于右花括号数目right+1

if(count>0){

count--;

}else{

//否则就是这种情况

//{{{{}}}}}{

//}}}}}{{{{{

//.....

//直接退出程序

printf("不匹配!\n");

return 0;

}

}

}

//如果程序能走到这里

//就已经排除}}}}{{{{这种特殊情况

//如果左花括号数目等于右花括号数目

if(count==0){

printf("匹配!\n");

}else{

printf("不匹配!\n");

}

return 0;

}

看了本篇文章,如果你还不会如何用C语言来验证花括号是否成对.....

请关注微信公众号gxdydd,在微信公众号下留言,有空我一定会回复的哦!

本文来自于高小调博客,如需转载,请注明出处!

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

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

相关文章

[js高手之路] html5 canvas系列教程 - 线条样式(lineWidth,lineCap,lineJoin,setLineDash)

上文,写完弧度与贝塞尔曲线[js高手之路] html5 canvas系列教程 - arcTo(弧度与二次,三次贝塞尔曲线以及在线工具),本文主要是关于线条的样式设置 lineWidth: 设置线条的宽度,值是一个数值,如lineWidth 5. 画3条不同宽度的线条&am…

在线斯诺克html5,用HTML 5打造斯诺克桌球俱乐部

本文介绍了如何利用HTML5技术来打造一款非常酷的斯诺克桌球游戏,文章中详细地列出了开发的全过程,并解说了实现这个游戏的几个关键点。在文章末尾我向大家提供了游戏的在线实例页面和源码下载链接,如果你只是想玩玩(需要使用支持HTML5的浏览器…

jpa jsf_完整的Web应用程序Tomcat JSF Primefaces JPA Hibernate –第3部分

jpa jsfPrimefaces AutoComplete,JSF转换器 这篇文章从第一部分和第二部分继续。 JSF拥有Converter工具,可以帮助我们从用户视图中获取一些数据并将其转换为从数据库或缓存中加载的对象。 在“ com.converter”包中,创建以下类:…

会话保持 (转)

http://www.cnblogs.com/kellyseeme/p/7599061.html 理论部分 会话也就是session,主要存储在服务器端,用来识别用户的身份。 在浏览器中向服务端发送请求的时候,不是http协议就是https协议,而两种协议在发送请求的时候&#xff0c…

html url js编码顺序,前端url编码

为什么要编码:Http协议中参数的传输是"keyvalue"这种简直对形式的,如果要传多个参数就需要用“&”符号对键值对进行分割如"?name1value1&name2value2",这样在服务端在收到这种字符串的时候,会用“&a…

AWS SQS和Spring JMS集成

Amazon WEB服务为我们提供了SQS消息传递服务。 sqs的java sdk与JMS兼容。 因此,可以将SQS与spring提供的JMS集成框架集成在一起,而不是将SQS用作简单的spring bean。 我将使用spring-boot和gradle。 gradle文件: group com.gkatzioura.sq…

手势相关-解决手势冲突

解决UITableview点击事件与手势的冲突 1.签手势代理 <UIGestureRecognizerDelegate> 2.是tableview点击事件则屏蔽手势 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view isKindOfClass:[UIS…

html动画用css还是js,javascript与css3动画结合使用小结

当Html5,css3已渐渐成为主流的时候&#xff0c;我还非常习惯的用js去做一些简单的动画。因为在桌面浏览器上&#xff0c; 并非所有的都支持css3。用户也倒是很奇怪&#xff0c;用户习惯并不是每个用户都可以被培养。总有不少人会觉得win7.win8没xp好用。但手机方面就大不一样了…

洛谷 P3146 [USACO16OPEN]248

P3146 [USACO16OPEN]248 题目描述 Bessie likes downloading games to play on her cell phone, even though she doesfind the small touch screen rather cumbersome to use with her large hooves. She is particularly intrigued by the current game she is playing.The g…

java将HTML文件转化为pdf文件,如何使用Java将HTML网页转换为PDF文件

我一直在互联网上搜索如何使用Java将HTML页面转换为PDF文件。我发现了很多指针&#xff0c;简而言之&#xff0c;它们不起作用或难以实现。我也下载了一个商业产品&#xff0c;pdf4ml;该API是我很乐意与之合作的&#xff0c;除了当我在维基百科上检索一个简单的页面时&#xff…

java抽象类和模板模式_测试抽象类和模板方法模式

java抽象类和模板模式摘自Wikipedia&#xff0c;“模板方法定义了算法的程序框架。 子类可以覆盖一个或多个算法步骤&#xff0c;以允许不同的行为&#xff0c;同时确保仍然遵循总体算法。” 通常&#xff0c;此模式由两个或多个类组成&#xff0c;一个是提供模板方法&#xff…

第三章 使用单元测试测试简单的首页

3.1第一个Django应用&#xff0c;第一个单元测试 python3 manage.py startapp lists 创建一个应用 功能测试站在用户的角度从外部测试应用&#xff0c;而单元测试从程序员的角度从内部测试应用 3.2Django中的单元测试 打开新生成的的文件lists/tests.py 注&#xff1a;单元测试…

微型计算机应用领域及应用,自考“微型计算机应用基础”自考大纲(1)

I. 课程性质微型计算机应用基础是高等教育自学考试经济管理类各专业的一门必修的应用基础课程&#xff0c;同时它也适用于文、法、医、农各专业选修。了解计算机这一现代化工具的性能、特点和一般工作原理&#xff0c;掌握计算机基础知识&#xff0c;学会计算机的基本操作&…

Lambda的Lambda(如果可选)

因此&#xff0c;我对JDK 8中Optional接口的两个限制感到沮丧。第一个问题是&#xff0c;没有明显的方法可以在块中执行else操作&#xff0c;因为只有isPresent方法&#xff0c;除非您使用的是老式的if语句。 第二个问题当然是古老的板栗&#xff0c;即使您能够做到&#xff0c…

win7链接html线到屏幕上,为你解决win7系统html文件图标变成空白的具体技巧 - win7吧...

我们经常在电脑上安装应用软件&#xff0c;难免会遇到诸如win7系统html文件图标变成空白的状况&#xff0c;对于大多电脑用户而言&#xff0c;大家几乎都是首次看到win7系统html文件图标变成空白这种状况&#xff0c;其实小编的经验是碰到win7系统html文件图标变成空白的问题别…

周赛。。。。

分糖果 分糖果 题意 要篮子里有不少于 n 块糖果&#xff0c;幼儿园的所有 n 个小朋友&#xff08;包括你自己&#xff09;都从篮子中拿走恰好一块糖&#xff0c;直到篮子里的糖数量少于 n 块。此时篮子里剩余的糖果均归你所有——这些糖果是作为你搬糖果的奖励。 思路 这个程…

计算机科学之前说,国内计算机科学十强大学是哪些?前2名没悬念,后面几所都不好说...

随着科技的发展、产业结构的不断优化&#xff0c;许多单位对计算机相关专业人才需求量越来越大&#xff0c;计算机专业毕业生就业情况普遍不差。加上计算机学科本身就给人一种“格局很高”的感觉&#xff0c;所以该专业成为了当下最热门的专业之一&#xff0c;每年高考都会有一…

服务引用代理类_在代理类中引用动态代理

服务引用代理类在Stackoverflow中有一个有趣的问题 &#xff0c;关于Spring Bean如何获​​得对由Spring创建的代理的引用以处理事务&#xff0c;Spring AOP&#xff0c;缓存&#xff0c;异步流等。需要对代理的引用&#xff0c;因为如果存在对自身的调用通过代理bean&#xff…

HTML中confirm替换,Javascript直接Confirm()函数替换

我想替换Javascript Confirm()函数以允许自定义按钮,而不是Yes / Cancel.我尝试搜索,但是所有解决方案都是事件驱动的,例如jquery对话框(其中代码不等待响应,而是事件驱动的).有谁知道非事件驱动的解决方案.它必须在Safari和IE中都可以使用(因此没有vbscript).这是系统许多部分…

关于windows防火墙关不掉解决办法

建立一个.bat文件&#xff0c;写以下内容: echo off title 正在启动防火墙服务 sc config MpsSvc startauto net start MpsSvc pause 至此完毕&#xff0c;重启试试就知道了 转载于:https://www.cnblogs.com/ciscolee/p/7616588.html