平衡符号用于编译器检查程序的语法错误,每一个右括号( }、]、))必然对应其相应的左括号(eg: [()] 合法;[(])不合法)
算法描述:
·做一个空栈,读入字符直到文件尾;
·如果字符是一个左括号则将其压入栈,
如果字符是一个右括号:如此时栈空,报错;否则,弹出栈顶元素,若与相应的左括号不匹配,报错;
·到文件尾,栈非空则报错;
算法分析:
时间复杂度为O(N),且对于输入进行一趟检验,是联机的;
代码实现 (只满足 {} 、[] 、()):
void balanceMark(string s)
{
stack
mark;
for (size_t i = 0; i < s.length(); ++i) {
switch (s[i]) {
case '{':
mark.push('{');
break;
case '[':
mark.push('[');
break;
case '(':
mark.push('(');
break;
case ')':
if (mark.size() == 0 || mark.top() != '(') {
cout<<"error with ()";
return ;
}
mark.pop();
break;
case ']':
if (mark.size() == 0 || mark.top() != '[') {
cout << "error with []";
return;
}
mark.pop();
break;
case '}':
if (mark.size() == 0 || mark.top() != '{') {
cout << "error with {}";
return;
}
mark.pop();
break;
default:
break;
}
}
if (mark.size() != 0) {
cout << "error with: ";
while (!mark.empty()) {
cout << mark.top();
mark.pop();
}
return;
}
cout << "get a balance mark";
}
加上main函数可以加以实验:
int main()
{
string s;
char c;
while (cin >> c) s.push_back(c);
balanceMark(s);
system("pause");
}