目录
原理
遇到左括号进行入栈操作,遇到右括号则进行出栈操作,对符号进行匹配判断其合法性
合法情况:扫描到右括号时都有与之匹配对应的左括号出栈
不可法情况:1.左右括号不匹配——扫描到右括号时,其对应的左括号不匹配
2. 右括号单身——扫描到右括号且栈空
3.左括号单身——处理完所有的括号后,栈不空(即有剩余的左括号)
算法描述
bool bracketCheck (char str[], int length) {
SqStack S;
InitStack(S); //初始化栈
for (int i; i<length; i++) {
if (str[i] == '(' || str[i] == '[' || str[i] == '{' )
Push(S,str[i]); //扫描到左括号,入栈
else {
if (StackEmpty(S)) //右括号单身
return false;
char topElem;
Pop(S, topElem); //栈顶出栈
//左右括号不匹配
if (str[i] == ')' && topElem != '(')
return false;
if (str[i] == ']' && topElem != '[')
return false;
if (str[i] == '}' && topElem != '{')
return false;
}
}
return StackEmpty(S); //扫描完全部括号以后,判空,看是否有左括号单身情况
}
算法流程图
具体代码
#define Maxsize 20
typedef struct
{
int data[Maxsize];
int top;
int length;
}SqStack;
//初始化
void InitStack(SqStack &S)
{
S.top = -1;
S.length = 0;
}
//判空
bool EmptyStack(SqStack S)
{
if (S.length == 0)
return true;
else
return false;
}
//入栈
void Push(SqStack &S, char c)
{
if (S.length == Maxsize)
{
cout <<"栈满"<<endl;
return;
}
S.top++;
S.data[S.top] = c;
S.length++;
}
//出栈
void Pop(SqStack &S, char &c)
{
if (S.length == 0)
{
cout << "栈空" <<endl;
return;
}
c = S.data[S.top];
S.top--;
S.length--;
}
//符号匹配函数
bool bracketCheck(char str[], int length)
{
SqStack S;
InitStack(S);
for (int i; i<length; i++)
{
if (str[i]=='(' || str[i]=='[' || str[i]=='{')
{
Push(S,str[i]); //左括号入栈
}
else //扫描到右括号
{
if (EmptyStack(S))
{
cout <<"匹配错误,存在右括号单身情况"<<endl;
cout << "错误地方:第"<< i+1 <<"个元素"<<str[i]<<endl;
return false;
}
char topelem; //定义栈顶元素,用于后续比较匹配问题
Pop(S,topelem);
if (str[i]==')' && topelem!='(')
{
cout <<"匹配错误,存在左右括号不匹配情况"<<endl;
cout << "错误地方:第"<< i+1 <<"个元素"<<str[i]<<endl;
return false;
}
if (str[i]==']' && topelem!='[')
{
cout <<"匹配错误,存在左右括号不匹配情况"<<endl;
cout << "错误地方:第"<< i+1 <<"个元素"<<str[i]<<endl;
return false;
}
if (str[i]=='}' && topelem!='{')
{
cout <<"匹配错误,存在左右括号不匹配情况"<<endl;
cout << "错误地方:第"<< i+1 <<"个元素"<<str[i]<<endl;
return false;
}
}
}
//遍历完全部括号后
if(!EmptyStack(S))
{
cout <<"匹配错误,存在左括号单身情况"<<endl;
return false;
}
else
return true;
}
int main()
{
cout <<"请输入有'('')''['']''{''}'组成的串:";
char str[Maxsize];
cin >> str;
int len = strlen(str);
if(bracketCheck(str,len))
{
cout<<"匹配成功"<<endl;
}
return 0;
}
运行结果图
正确测试样例:
错误测试样例:
1.左括号单身
2.右括号单身
3.左右括号不匹配