懒得解释,上代码。
把符号分类处理一下就行,比如"("的右边不能是")"和加减乘除。")"的左边不能是"("和加减乘除。
说的好苍白,总之就是这样,结合前面一篇处理多余括号的观感跟坏(?)
仙人指路:去除多余括号
#include <iostream>
using namespace std;
struct sentence {
char c;
int index;
};
sentence s[255] = {};//原式
sentence b[255] = {};//符号集
int k = 0;
int length;
bool TOW(sentence a) {
//cout << "!" << a.c << "!" << a.index << endl;
if (a.c == '(') {
if (s[a.index + 1].c <= 47 && s[a.index + 1].c >= 42 || s[a.index + 1].c == ')')return false;
}
else if (a.c == ')') {
if (s[a.index - 1].c <= 47 && s[a.index - 1].c >= 42 || s[a.index - 1].c == '(') return false;
}
else {
if (s[a.index + 1].c <= 47 && s[a.index + 1].c >= 42)return false;
if (s[a.index - 1].c <= 47 && s[a.index - 1].c >= 42) return false;
}
return true;
}
int main() {
string str;
cin >> str;
length = str.length();
int cntL = 0;
int cntR = 0;
for (int i = 0; i < str.length(); i++) {
s[i].c = str[i];
s[i].index = i;
if (str[i] <= 47 && str[i] >= 40) {//录入符号
if (str[i] == '(') cntL++;
if (str[i] == ')') cntR++;
b[k].c = str[i];
b[k].index = i;
//cout << b[k].c << " " << b[k].index << endl;
k++;
}
}
if (cntL != cntR) {
cout << "错误" << endl;
return 0;
}
for (int i = 0; i < k - 1; i++) {
if (!TOW(b[i])) {
cout << "错误" << endl;
return 0;
}
}
cout << "正确" << endl;
}