习题3.8 符号配对 (20 分)【满分】【c语言】

news/2024/11/24 11:04:20/

习题3.8 符号配对 (20 分)

请编写程序检查C语言源程序中下列符号是否配对://、(与)、[与]、{与}。
输入格式:
输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。

输出格式:
首先,如果所有符号配对正确,则在第一行中输出YES,否则输出NO。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号;如果缺少右符号,则输出左符号-?。

输入样例1:
void test()
{
int i, A[10];
for (i=0; i<10; i++) /*/
A[i] = i;
}
.

输出样例1:
NO
/*-?
输入样例2:
void test()
{
int i, A[10];
for (i=0; i<10; i++) /**/
A[i] = i;
}]
.

输出样例2:
NO
?-]
输入样例3:
void test()
{
int i
double A[10];
for (i=0; i<10; i++) /**/
A[i] = 0.1*i;
}
.

输出样例3:
YES

代码如下:

#include<stdio.h>
#define maxsize 1003
#include<stdlib.h>
typedef struct node *stack;
struct node{char ch[maxsize];int top;
};
stack creat()
{stack s;s=(stack)malloc(sizeof(struct node));s->top=-1;return s;	
} 
void push(stack s,char cht)
{s->top++;s->ch[s->top]=cht;	
} int main()
{int i,k=0,j;static char ch1[1000],ch2[1000],ch[10000];struct node *s1=NULL;s1=creat();ch1['(']=')';ch1['{']='}';ch1['[']=']';//'*/'用'>'来代替; //'/*'用'<'来代替; ch1['<']='>';for(i=0;;i++){gets(ch);if(ch[0]=='.'&&ch[1]=='\0') break;for(j=0;ch[j]!='\0';j++){if(ch[j]=='('||ch[j]==')'||ch[j]=='['||ch[j]==']'||ch[j]=='{'||ch[j]=='}'){ch2[k++]=ch[j];}else if(ch[j]=='/'&&ch[j+1]=='*'){ch2[k++]='<';j++;}else if(ch[j]=='*'&&ch[j+1]=='/'){ch2[k++]='>';j++;}}}int flag=1;for(i=0;i<k;i++){if(ch2[i]=='('||ch2[i]=='['||ch2[i]=='{'||ch2[i]=='<'){push(s1,ch2[i]);}else if(ch2[i]==')'||ch2[i]==']'||ch2[i]=='}'||ch2[i]=='>'){if(s1->top!=-1&&ch1[s1->ch[s1->top]]==ch2[i]){s1->top--;}else {printf("NO\n");//缺左边的符号; if(s1->top==-1){if(ch2[i]==')') printf("?-)");else if(ch2[i]=='}') printf("?-}");else if(ch2[i]==']') printf("?-]");else if(ch2[i]=='>') printf("?-*/"); }//缺右边的符号; else if(ch1[s1->ch[s1->top]]!=ch2[i]){if(s1->ch[s1->top]=='(') printf("(-?");else if(s1->ch[s1->top]=='[') printf("[-?");else if(s1->ch[s1->top]=='{') printf("{-?");else if(s1->ch[s1->top]=='<') printf("/*-?");}flag=0;break;}}}//切记,当输出YES时,堆栈一定为空;if(flag==1&&s1->top==-1) printf("YES");//当输入字符串为"[[[]"时;//左边有多余左符号;else if(flag==1&&s1->top!=-1){printf("NO\n");if(s1->ch[s1->top]=='(') printf("(-?");else if(s1->ch[s1->top]=='[') printf("[-?");else if(s1->ch[s1->top]=='{') printf("{-?");else if(s1->ch[s1->top]=='<') printf("/*-?");}return 0;
}


http://www.ppmy.cn/news/1005983.html

相关文章

【项目排错】谨防不同包下的BeanUtils混用

今天排查项目里一个奇奇怪怪的NPE问题&#xff0c;经过调试&#xff0c;最后竟是混用了不同包的BeanUtils所导致的&#xff0c;这里记录一下。 在 Java 中&#xff0c;有多个不同包下的 BeanUtils 类存在。这些类提供了类似的功能&#xff0c;但由于它们来自不同的库或框架&…

GEE:分层抽样

作者:CSDN @ _养乐多_ 本文将介绍在Google Earth Engine (GEE) 平台上,实现在每一个类别中分别提取指定比例(本例50%)的样本数据得到一个新的矢量数据的代码。该过程为分层抽样。该方法可用于机器学习分类中,用于减少误差,提高效率,减少计算资源,增加样本代表性。 结…

化学合成有机化学 | 逆合成分析软件/数据库汇总

化合物逆合成路线设计软件是一类用于辅助化学家设计化合物合成路线的工具。这些软件通常基于化学知识和反应数据库&#xff0c;能够根据目标化合物的结构和性质&#xff0c;提供合成路线的建议和优化方案。以下是一些常见的化合物逆合成路线设计软件&#xff1a; IntSynth&…

增量式PID算法及其MATLAB实现

增量式PID算法是一种常用的控制算法,用于控制系统中的反馈控制。它通过对系统的误差进行递推式的计算,实现对系统输出的调节,使得系统的输出逐渐趋向于设定值。 delta u(k)=u(k)-u(k-1)=Kp*(e(k)-e(k-1))+Ki*e(k)+Kd*(e(k)-2*e(k-1)+e(k-2)) PID算法由三个部分组成:比例(…

Day 12 C++ 面向对象

目录 什么是面向对象 C面向对象 C面向对象的三大特性 封装 继承 多态 其他概念 构造函数和析构函数 运算符重载 动态内存管理 C 友元&#xff08;friend&#xff09; C对象模型和this指针 ps:本文章只是总结和大纲&#xff0c;详细知识请点击蓝字进相应的链接了解 什…

简单游戏截图_可控截取内容2

一个需求 我需要在场景中截取不同层级的截图(如只截模型或只截UI或只截外部相加看到的画面 或全都截或和Shader配合呈现人眼夜视仪热成像的画面切换) 将截图排到列表中&#xff0c;在场景UI中展示出来 如何做 相机要能够看到不同的画面 将当前帧画面存储下来 将存储的画面展示出…

HOT74-数组中的第K个最大元素

leetcode原题链接&#xff1a;数组中的第K个最大元素 题目描述 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O…

go test

关于go test 报错 command-line-arguments go test 直接调用被测试go文件方法时候报错 command-line-arguments [command-line-arguments.test]&#xff0c;这里已经明确指出了命令参数问题 PS E:\code\mqtt> go test .\client_test.go # command-line-arguments [comma…