-
符号配对
2019-09-28 00:14:54请编写程序检查C语言源程序中下列符号是否配对:/与/、(与)、[与]、{与}。 输入格式: 输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100...请编写程序检查C语言源程序中下列符号是否配对:/与/、(与)、[与]、{与}。
输入格式:
输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。输出格式:
首先,如果所有符号配对正确,则在第一行中输出YES,否则输出NO。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号;如果缺少右符号,则输出左符号-?。我的思绪
一开始看到这个题,就知道使用栈——因为之前了解过编译器的一些括号对齐原理。
只不过,这道题目出的太含糊了,好多东西都没有交代清楚,容易使人走弯路,你必须像出题人期待的那个水平和想法去敲代码,否则不会通过的。就像……八股?我这么认为这道题目,太死板而且含糊了。1 没有明确“第一个”是什么意思。第一个不匹配的括号,啥意思?
我的同学有敲了好几个小时的实在是过不了点,就知道想法肯定和出题人不一样,于是找了一段ac代码,运行一下发现了以下几个案例:
{(】,按照常理来说,应该输出{(人类视角)或者】(计算机视角),但是运行结果是(。
实际上这道题目输出的错误处,不同人会有不同的理解,所以就算有大佬来敲,可能也会摸索很长一段时间。
那么,出题人什么意思呢?
出题人:只要栈不为空,就给我输出弹出的那个括号不匹配。如果栈空了,在按照你碰到的应该弹出一个的括号去输出。
对此,我只想说一句呵呵→_→ 要不是同学来找我讨论,我真的会用计算机视角做这道题目,那今天天亮之前绝对做不出来,更写不出这篇博客。2 没有说明一些复杂的样例不用考虑。
第一次看到这个题目,我构思出来的测试样例中有这么一组:
printf("((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((");
输出什么?应该输出YES吧,没有不配对的。
可如果这样,这道题目就复杂了,应该出现在竞赛题目上面,而不是日常的PTA里。
我靠,这我特么到底是做还是不做?
郁闷了几分钟,才猜着它不考虑这种情况来敲代码。3 我的代码
//这次本九熬夜给你们写注释!!!
//这次本九熬夜给你们写注释!!!
//这次本九熬夜给你们写注释!!!我的思路和大部分人一样,用栈实现。
感谢打开了C++,可以直接使用stl了。#include<iostream> #include<string> #include<stack> using namespace std; int main() { string s; char b[7]; b[1] = '('; b[2] = ')'; b[3] = '['; b[4] = ']'; b[5] = '{'; b[6] = '}';//用来存储括号,省掉三分之二的代码量。如果你代码超过100行了,那很有可能是因为用了6个if而不是2个。 int find = 0; bool isasimple = false; stack<char> bracket;//特地百度了一下括号的英文单词,就用他做栈名字吧。 while (1) { getline(cin, s); if (s==".") goto zoulou;//当结束时,直接“zoulou”(走咯) for (int i = 0; i < s.length(); i++) {//*/是两个字符比较特殊,单独讨论 if (s[i] == '/' && 1 + i < s.length()) if (s[i + 1] == '*') { bracket.push(s[i]);//我们将两个字符以/的形式保存,这样方便 i++;//因为这时候是两个字符 continue; } if (s[i] == '*' && 1 + i < s.length()) if (s[i + 1] == '/') { if (bracket.empty()) { cout << "NO" << endl << "?-*/" << endl; return 0; } else { if (bracket.top() != '/') { cout << "NO" << endl << bracket.top() << "-?" << endl; return 0; } else { bracket.pop(); i++;//弹栈是弹一个,但是让栈弹的却是两个字符 continue; } } } isasimple = false; for (find = 1; find <= 6; find++) { if (b[find] == s[i]) {//找一下是不是剩余的六个字符 isasimple = true; break; } } if (isasimple) { if (find % 2 == 1) { bracket.push(s[i]); continue; } else { if (bracket.empty()) { cout << "NO" << endl << "?-" << b[find] << endl; return 0; } else { if (bracket.top() == '/') { cout << "NO" << endl <<"/*-?" << endl; return 0; } else if (bracket.top() != b[find - 1]) { cout << "NO" << endl << bracket.top() << "-?" << endl; return 0; } else { bracket.pop(); continue; } } } } } } zoulou: if (bracket.empty()) {//走咯之后还没完,如果栈不是空的,也还会出错。 cout << "YES" << endl; } else { cout << "NO" << endl << bracket.top() << "-?" << endl; } return 0; }
-
PTA 符号配对
2019-02-02 00:26:19请编写程序检查C语言源程序中下列符号是否配对:/与/、(与)、[与]、{与}。 输入格式: 输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个...符号配对 (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> #include<string.h> #include<iostream> using namespace std; int main() { char a[500000]= {0}; int stack[205]= {0}; int h=0; while(1) { cin.getline(a,500000); if(strcmp(a,".")==0) break; int n = strlen(a); int flag=0; for(int i=0; i<n; i++) { if(a[i] == '{' || a[i] == '(' || a[i] == '[') { stack[h] = a[i]; h++; } else if(a[i] == '/' && i+1 < n && a[i+1] == '*') { stack[h] = a[i]; h++; stack[h] = a[i+1]; h++; i++; } else if(a[i] == '}' || a[i] == ')' || a[i] == ']') { if(h == 0) { printf("NO\n"); printf("?-%c",a[i]); flag = 1; return 0; } else { if(a[i] == '}' && stack[h-1] != '{') { printf("NO\n"); if(stack[h-1] == '*') printf("/*-?"); else printf("%c-?",stack[h-1]); flag=1; return 0; } else if(stack[h-1] != '(' && a[i] == ')') { printf("NO\n"); if(stack[h-1] == '*') printf("/*-?"); else printf("%c-?",stack[h-1]); flag=1; return 0; } else if(stack[h-1] != '[' && a[i] == ']') { printf("NO\n"); if(stack[h-1] == '*') printf("/*-?"); else printf("%c-?",stack[h-1]); flag=1; return 0; } } h--; } else if(a[i] == '*' && i+1<n && a[i+1] == '/') { if(h == 0) { printf("NO\n"); printf("?-*/"); flag = 1; return 0; } else if(stack[h-1] != '*') { printf("NO\n"); printf("%c-?",stack[h-1]); flag=1; return 0; } h=h-2; i++; } } } if(h!=0) { printf("NO\n"); if(stack[h-1] == '*') printf("/*-?"); else printf("%c-?",stack[h-1]); return 0; } else printf("YES"); return 0; }
-
6 符号配对
2017-03-11 12:57:57请编写程序检查C语言源程序中下列符号是否配对:/*与*/、(与)、[与]、{与}。 输入格式: 输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不...请编写程序检查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
要注意符合c语言的规范,嗯,被坑了。以为各种括号单独自己配对了。
实际上是全括号匹配。
思路:
首先就是把串全部读进来,合成一个大串,只保留括号即可。
然后再对新生成的串处理,读入左括号,直接压入栈顶。
如果读入的是右括号:
1.如果栈为空,那么缺少与之对应的左括号。、
2.如果栈顶元素与之不匹配,那么缺少与栈顶元素相匹配的右括号。
处理完之后,如果栈为空,则表示完全匹配,如果有剩余,那么就是缺少右括号。因为是输出第一个缺少的,所以直接输出栈尾的元素就可以。
#include <bits/stdc++.h> using namespace std; const int MAXN=1e5+10; const int inf=1e9; int n,m; int top,flag; char ans[MAXN]; char s[MAXN*10]; char sta[MAXN]; int main() { int cnt=0; while(gets(s)&&s[0]!='.') { int l=strlen(s); for(int i=0; i<l; ++i) { if(s[i]=='('||s[i]==')'||s[i]=='{'||s[i]=='}'||s[i]=='['||s[i]==']') { ans[cnt++]=s[i]; } else if(s[i]=='/'&&s[i+1]=='*') { ans[cnt++]='a'; i++; } else if(s[i]=='*'&&s[i+1]=='/') { ans[cnt++]='b'; i++; } } } //puts(ans); top=0; flag=1; int i; for(i=0; i<cnt; ++i) { if(ans[i]=='('||ans[i]=='['||ans[i]=='{'||ans[i]=='a') { sta[top++]=ans[i]; } else if(!top) { puts("NO"); printf("?-"); if(ans[i]=='b')printf("*/\n"); else printf("%c\n",ans[i]); flag=0; break; } else if(ans[i]-sta[top-1]!=1&&ans[i]-sta[top-1]!=2) { puts("NO"); if(sta[top-1]=='a')printf("/*"); else printf("%c",sta[top-1]); printf("-?\n"); flag=0; break; } else top--; } if(flag) { if(!top)puts("YES"); else { puts("NO"); if(sta[0]=='a')printf("/*"); else printf("%c",sta[0]); printf("-?\n"); } } return 0; }
-
java中对有符号的数据表示法
2014-12-08 20:30:20java中对有符号的数据表示法: 在计算机中,有符号的数据的表示法通常分为 原码、反码和补码三种形式,所有的数据运算都是采用补码的是形式进行。 原码:最高位为符号位,“0”为正数,“1”为负数 其余位数...java中对有符号的数据表示法:
在计算机中,有符号的数据的表示法通常分为 原码、反码和补码三种形式,所有的数据运算都是采用补码的是形式进行。
原码:最高位为符号位,“0”为正数,“1”为负数 其余位数表示数值的大小;
也就是数正数的原码的最高位是0,
负数的原码最高位是1,其他的是数值位数
反码:正数的反码和原码相同;
负数的反码是对其原码逐位取反,但是符号位不算
补码:正数的补码与其原码相同(正数的原码反码补码都是相同的)
负数的补码是在其反码的末位加1
-
XML中对特殊符号的处理
2008-06-20 10:12:00为了避免把字符数据和标记中需要用到的一些特殊符号向混淆,XML还提供了一些有用的实体引用。实体引用的作用是,当在字符数据中需要使用这些特殊符号时,我们采用它的实体引用来代替。这些特殊的XML实体引用包括:>... -
C C++ Java中链接器对全局符号的解析
2014-01-13 11:34:40在C语言中,对全局符号的符号解析很棘手,因为相同的符号会被多个目标文件定义。在这种情况中,链接器必须要么标志一个错误,要么以某种方法选出一个定义并抛弃其他定义。 在链接时,编译器输出每个全局符号给汇编... -
通过matlab对verilog中无符号数、有符号数进行转化
2012-12-13 14:59:06在FPGA 设计过程中经常会遇到关于数表示之间的...(1)在FPGA设计过程中,能够很直接的看出数字的位宽,但经常以无符号数的形式输出,在后继的处理中往往要将之转化为有符号数(如:计算频谱): 对于一个比特宽度 -
判断字符串中符号是否成对出现
2016-07-07 17:29:55//利用堆棧的概念,先进后出的原则判断对应的符号是否成对出现 //定义一个字符串和栈 String s="abc([{adsf}]s)df"; Stack ss=new Stack(); boolean flag=true; char c;//定义一个char 遍历字符串的时候... -
ArcGIS Pro中符号化
2020-03-25 21:26:58与ArcMap中符号化类似,ArcGIS Pro中的符号化方式更酷炫,不仅仅可以通过多个图层的方式制作点线面符号,还可以直接制作多图层的符号样式,比如发过的萤火虫效果以及夜空中最耀眼的小星星。今天仅对其最基本的符号化... -
ArcGis Engine中实现对符号的预览图输出
2009-06-26 13:34:00ArcGis Engine中实现对符号的预览图输出07-11-12 11:24:09 作者:Aji 出处:中国GIS资讯网在ArcGis Engine中实现对符号的预览,生成预览图片。使用的时候只要调用SymbolToBitmp(符号,宽,高)就可以返回生成的图片了... -
ArcGIS Engine中实现对符号的输出预览
2010-02-02 11:48:00在ArcGis Engine中实现对符号的预览,生成预览图片。使用的时候只要调用SymbolToBitmp(符号,宽,高)就可以返回生成的图片了。关键代码如下:public System.Drawing.Bitmap SymbolToBitmp(ESRI.ArcGIS.Display.... -
7-2 符号配对
2019-10-02 18:01:21请编写程序检查C语言源程序中下列符号是否配对:/与/、(与)、[与]、{与}。 输入格式: 输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个... -
C语言中有符号与无符号
2018-04-13 18:04:42现在我们来分析下C语言中的有符号数与无符号数。我们知道,计算机只能识别二进制0和1,那么我们在程序中写的-12,计算机该怎么去识别这个"-"号?计算机怎么知道我们写的数,是正数还是负数?现在就一起来... -
matlab中常用符号
2019-05-15 11:12:42在使用MATLAB的过程中,经常需要对输出图形中的变量进行标注,其中经常遇到的难题就是如何标注各种上标、下标、斜体、黑体、箭头、上圆圈、正负号等特殊符号,以及如何标注特殊的数学符号。这里第一机电网给大家总结... -
将源代码中的全角符号转换成半角符号并对代码风格进行美化
2012-04-14 18:36:38从网上拷下来的代码经常会出现全角符号,代码风格也很糟糕,可以用下面的方法进行修正美化。 1、安装astyle ...#将某个源代码文件中的全角符号转换成半角符号 #调用astyle 将某个源代码文件转换成li -
R语言中的Wilcoxon符号秩检验与配对学生t检验
2019-06-12 21:40:25在这篇文章中,我们将探索比较两组依赖(即成对)定量数据的测试:Wilcoxon符号秩检验和配对学生t检验。这些测试之间的关键区别在于Wilcoxon的测试是非参数测试,而t测试是参数测试。在下文中,我们将探讨这种差异的... -
ArcGis Engine中实现对符号的预览图输出
2008-04-18 16:37:00ArcGis Engine中实现对符号的预览图输出 07-11-12 11:24:09 作者:Aji 出处:中国GIS资讯网 -
PTA-符号配对
2017-11-23 08:13:00请编写程序检查C语言源程序中下列符号是否配对:/*与*/、(与)、[与]、{与}。 -
python常用符号-python中^符号
2020-10-30 00:15:24广告关闭2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品。未来,我们一起乘风破浪,创造无限可能。1.算数运算符?... 只可以在模块或类定义层内对函数进行修饰,不允许修修饰... -
符号配对 (20分)
2020-06-22 20:45:12请编写程序检查C语言源程序中下列符号是否配对:/与/、(与)、[与]、{与}。 输入格式: 输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个... -
js将英文符号转为ASCII码以及对中文的转换
2017-05-03 13:56:13经检查此PN中包含有+号,此PN当年很‘单纯’,只包含字母数字,所以被我原封不动的放入url参数中,今天它进化出了 +,这在url中被转成了空格,而且客户不保证今后不会用其他符号。。。 URL 中+号表示空格 %2B ... -
符号配对 (20 分)
2018-09-29 19:46:19请编写程序检查C语言源程序中下列符号是否配对: /* 与 */、( 与 )、[ 与 ]、{ 与 }。 输入格式: 输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的... -
tomcat高版本对url中特殊符号限制的解决方法
2019-03-05 17:08:18背景:研发反馈,在页面点击上传execl功能,上传文件的时候,tomcat直接拒绝了,显示是url中含有相关的字符 解决: 在server.xml中设置如下即可 <Connector port="8084" protocol="... -
对html中特殊的符号进行过滤处理_Filter类
2015-03-29 22:33:34// 把字符串直接复制到chars[]数组中 content.getChars( 0 , content.length(), chars, 0 ); // 重新拼接 StringBuffer sb = new StringBuffer(); // 循环 for ( int index = 0 ; index ; index++)... -
数据结构课设 符号配对
2016-03-18 08:53:29请编写程序检查C语言源程序中下列符号是否配对:/*与*/、(与)、[与]、{与}。 输入格式: 输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过...