假设表达式中允许包含两种括号:圆括号与方括号,其嵌套顺序随意,即() 或者[([][])]都是正确的。而这种 [(]或者(()])或者([()) 都是不正确的格式. 检验括号是否匹配的方法可用"期待的急迫程度"这个概念来描述。
例如,考虑以下括号的判断:
思路:
- 将第0个元素压栈
- 遍历[1,strlen(data)]
(3). 取栈顶字符
(4). 检查该字符是左括号("(","[")
a.是左"(",则判断紧接其后的data[i]是为右")"
YES->压栈,NO->出栈
b.是左"[",则判断紧跟其后的data[i]是为右"]"
YES->压栈,NO->出栈
c.表示式如果以"#"结尾,则判断紧跟其后的data是为左"(""]"
YES->压栈,NO->-1;
3.遍历结束,则判断栈是否为空,为空则表示匹配成功;否则匹配失败;
int ExecuteData1(char* data){
int len = (int)strlen(data);
if (len < 1) {
return -1;
}
char *stack = malloc(sizeof(char) * len);
int top = 0;
stack[top] = data[0];
for (int i = 1; i < len; i++) {
char topStr = stack[top];//获取栈顶
switch (topStr) {
case '(':
if (data[i] == ')') {//出栈
if (top > 0) {
top--;
}
} else {//入栈
top++;
stack[top] = data[i];
}
break;
case '[':
if (data[i] == ']') {
if (top > 0) {
top--;
}
} else {
top++;
stack[top] = data[i];
}
break;
default:
if (data[i] == '(' || data[i] == '[' ) {//入栈
top++;
stack[top] = data[i];
}
break;
}
}
free(stack);
if (top == 0) {//为空栈空,则匹配成功
return 0;
} else {
return -1;
}
}
int main() {
char data[180];
scanf("%s",data);
int result = ExecuteData1(data);
if(result==0)printf("括号是正确匹配的\n");
else printf("括号匹配不正确\n");
return 0;
}
网友评论