问题描述
- 输入一字符串,检查字符串中 { }、[ ]、( ) 三种括号是否成对出现。不同括号间不能交叉出现且左右括号顺序不能颠倒,如 ) (、{ ( } )等。
- 匹配示例:{ ( ) } ,{ [ ( ) ] }等
解决方法
- 利用栈的特性,发现左括号就入栈,然后检索到右括号与栈顶的左括号比对,如果为同一种括号则栈顶括号出栈;如果不是同一种括号(交叉)或者栈为空(只有右括号)则匹配失败。
- 最后若栈空则说明括号匹配成功
代码
#include <stdio.h>
#include <string.h>
struct stack
{
int top;
char *bottom;
int size;
};
int IsEmpty(struct stack *s)
{
if (s->top == -1)
{
return 0;
}
else
{
return 1;
}
}
int push(struct stack *s, char x)
{
char *p = s->bottom;
p[++(s->top)] = x;
}
int pop(struct stack *s)
{
int ret = IsEmpty(s);
if (ret == 0)
{
printf("此栈已空\n");
return 0;
}
s->top--;
}
char rToL(char c)
{
switch (c)
{
case '}':
return '{';
case ']':
return '[';
case ')':
return '(';
}
}
int main()
{
int i = 0;
int MAX = 1024;
char str[MAX];
fgets(str, MAX, stdin);
int size = strlen(str);
char stack[size];
struct stack s = {-1, stack, size};
for (i = 0; i < size; i++)
{
if (str[i] == '{' || str[i] == '[' || str[i] == '(')
{
push(&s, str[i]);
}
if (str[i] == '}' || str[i] == ']' || str[i] == ')')
{
str[i] = rToL(str[i]);
if (stack[s.top] == str[i])
{
pop(&s);
}
else
{
printf("括号不匹配!\n");
return 0;
}
}
}
int ret = IsEmpty(&s);
if (ret == 0)
{
printf("括号匹配^v^!\n");
}
else
{
printf("括号不匹配!\n");
}
return 0;
}
终端显示
- 第一次在终端输入字符串p[++(s->top)] = x ;
p[++(s->top)] = x;
括号匹配^v^!
- 第二次在终端输入字符串if (str[i] == ‘{’ || str[i] == ‘[’ || str[i] == ‘(’ ) :
if (str[i] == '{' || str[i] == '[' || str[i] == '(')
括号不匹配!
|