题解.全网最少内存(剩余0名额超99%)
2026-07-24 14:07:01
发布于:河南
7阅读
0回复
0点赞
防偷看
思路
实现代表式合法性校验器,检测三类错误:
- 非法字符:表达式中出现不允许的字符
- 括号不匹配:括号数量不一致或顺序错误
- 语法错误:操作符/操作数的排列不符合代数规则(如连续字母、连续操作符等)
1.字符
允许的字符包括:
- 操作数:小写字母(a-c)(注意不是a-z!!!)、数字(0-9)
- 操作符:+、-、*、/
- 括号:(、)
- 结束符:;(不属于表达式本身)
2.校验步骤与逻辑设计
-
非法字符检测(11-13行)
逻辑:遍历输入字符串,检查每个字符是否属于允许的字符集合
允许字符集合:a-c、0-9、+、-、*、/、(、)、;
若遇到不在集合中的字符,立即返回 ERROR 1 -
括号匹配检测(14-22,28-30行)
数据结构:使用栈(Stack)来跟踪括号嵌套关系
遇到 (:压入栈中
遇到 ):
如果栈为空(没有对应的左括号),返回 ERROR 2
如果栈不为空,弹出栈顶的 ((匹配成功)
遍历结束后,检查栈是否为空:
若栈不为空(存在未匹配的左括号),返回 ERROR 2 -
语法规则校验(23-25行)
核心逻辑:跟踪当前字符的类型,确保操作符与操作数的排列符合代数语法
规则约束:
当前字符 前一个字符允许的类型 错误情况
操作数 ....操作符、左括号、开头 前一个字符是操作数(如 ab)
操作符 ....操作数、右括号 ............前一个字符是操作符/左括号/开头
左括号 ....操作符、左括号、开头 前一个字符是操作数/右括号
右括号 ....操作数、右括号 .............前一个字符是操作符/左括号/开头
- 输入结束处理
遇到 ; 时停止遍历
遍历结束后,需确保最后一个有效字符不是操作符或左括号
参考代码(全网最少内存)
代码1 带行号版
01#include<cstdio>
02#include<stack>
03using namespace std;
04stack<char>k;
05int main(){
06 char s[1000];char q=0;
07 scanf("%s",s);
08 for(int i=0;s[i]!='\0';i++){
09 char c=s[i];
10 if(c==';')break;
11 if((!('a'<=c&&c<='c')&&!('0'<=c&&c<='9')&&!(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c==';'))){
12 printf("ERROR 1");return 0;
13 }
14 if(c=='('){
15 k.push('(');
16 }
17 if(c==')'){
18 if(k.empty()){
19 printf("ERROR 2");return 0;
20 }
21 else k.pop();
22 }
23 if(q&&(((c>='a'&&c<='z')&&(q>='a'&&q<='z'))||((c=='+'||c=='-'||c=='*'||c=='/')&&(q=='+'||q=='-'||q=='*'||q=='/')))&&q!=';'){
24 printf("ERROR 3\n");return 0;
25 }
26 q=c;
27 }
28 if(!k.empty()){
29 printf("ERROR 2");return 0;
30 }
31 printf("OK");
32 return 0;
33}
代码2 不带行号版
#include<cstdio>
#include<stack>
using namespace std;
stack<char>k;
int main(){
char s[1000];char q=0;
scanf("%s",s);
for(int i=0;s[i]!='\0';i++){
char c=s[i];
if(c==';')break;
if((!('a'<=c&&c<='c')&&!('0'<=c&&c<='9')&&!(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c==';'))){
printf("ERROR 1");return 0;
}
if(c=='('){
k.push('(');
}
if(c==')'){
if(k.empty()){
printf("ERROR 2");return 0;
}
else k.pop();
}
if(q&&(((c>='a'&&c<='z')&&(q>='a'&&q<='z'))||((c=='+'||c=='-'||c=='*'||c=='/')&&(q=='+'||q=='-'||q=='*'||q=='/')))&&q!=';'){
printf("ERROR 3\n");
return 0;
}
q=c;
}
if(!k.empty()){
printf("ERROR 2");return 0;
}
printf("OK");
return 0;
}
这里空空如也





有帮助,赞一个