题解
2024-05-18 17:41:42
发布于:上海
14阅读
0回复
0点赞
首先先说明一下:官方AC君已经把bug修复了,Ok要改为OK,Error要改为ERROR,而且多增加了几个测试点
题解如下:
#include<iostream>
#include<stack>
using namespace std;
bool is_limited_char(char c){
return c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')';
}
bool is_limited_alpha(char a){
return a>96&&a<100;
}
bool is_limited_calculation(char d){
return d=='+'||d=='-'||d=='*'||d=='/';
}
stack<char> s;
int main(){
char c,lc='\0';
while(cin>>c){
if(c==';')break;
if(is_limited_alpha(c)&&is_limited_alpha(lc)||
is_limited_calculation(c)&&is_limited_calculation(lc)){
cout<<"ERROR 3"<<endl;
return 0;
}
if(c=='(')s.push('(');
if(c==')'){
if(s.empty()){
cout<<"ERROR 2"<<endl;
return 0;
}
else s.pop();
}
if(!is_limited_char(c)&&!is_limited_alpha(c)){
cout<<"ERROR 1"<<endl;
return 0;
}
lc=c;
}
if(!s.empty()){
cout<<"ERROR 2"<<endl;
return 0;
}
else{
cout<<"OK"<<endl;
return 0;
}
}
分析思路:
1、括号匹配:栈,读取一个左括号存入栈,读取一个右括号匹配左括号,若匹配则出栈,否则直接ERROR 2;
结束程序时要判断栈是否为空,若不为空则有多余左括号未匹配,直接ERROR 2。
2、不允许的字符:直接判断是否为加减乘除括号和小写字母,若不是则直接ERROR 1。
3、表达式规则:如果连续两个是字母或者连续两个是加减乘除的运算(注意:+-视为违法,而+()视为合法),直接ERROR 3。
这里空空如也
有帮助,赞一个