括号匹配
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效
【有效字符串需满足】
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
3.注意空字符串可被认为是有效字符串。
【题目分析】:
我们知道任何一种括号都是两两成对出现的,因此,再出现左括号是,必有有一个相匹配的右括号出现,但如果仅仅满足这个条件则不能正常的进行匹配,因为仅仅让出现数量相同是远远不够的,还需要让他们按照正确的顺序进行结合才行。因此,我们使用栈结构,利用其先进后出的特点将左括号压入,遇到右括号与栈顶元素比价,并且将其出栈。最后当栈空的同时结束遍历则说明匹配。具体代码入下:
首先简单构造一个栈
typedef char STDataType;
typedef struct stack
{
STDataType* _data;
int _size;
int _capacity;//栈的容量
}stack;
void initStack(stack* st)//初始化栈
{
if (st == NULL)
return;
st->_data = NULL;
st->_capacity = st->_size = 0;
}
void checkCapacity(stack* st)//容量检查
{
if (st->_capacity == st->_size)
{
int newCap = st->_capacity == 0 ? 1 : 2 * st->_capacity;
st->_data = (STDataType*)realloc(st->_data, sizeof(STDataType)*newCap);
st->_capacity = newCap;
}
}
void stackpush(stack* st, STDataType val)//压栈
{
if (st == NULL)
return;
checkCapacity(st);
st->_data[st->_size++] = val;
}
void stackpop(stack* st)//出栈
{
if (st == NULL || st->_size == 0)
return;
--st->_size;
}
STDataType stackTop(stack* st)//取栈顶元素
{
if (st == NULL || st->_size == 0)
return 0;
return st->_data[(st->_size) - 1];
}
int stackEmpty(stack* st)//判空
{
if (st == NULL || st->_size == 0)
return 1;
else
return 0;
}
在此基础上进行判断子程序:
//判断函数
bool isRight(char* s)
{
//括号映射
char map[3][2] = { { '(', ')' }, { '{', '}' }, { '[', ']' } };
struct stack st;
initStack(&st);
while (*s)
{
int flag = 0;
for (int i = 0; i < 3; ++i)//判断是否为左括号
{
if (*s == map[i][0])
{
stackpush(&st, *s);
//判断下一个字符
++s;
flag = 1;
break;
}
}
if (flag == 0)
{
//取出栈顶元素,先判断栈是否为空
if (stackEmpty(&st))
return false;
char topchar = stackTop(&st);
stackpop(&st);
for (int i = 0; i < 3; ++i)//判断与哪一个匹配
{
if (map[i][1] == *s)
{
if (map[i][0] == topchar)
{
//判断下一个字符
++s;
break;
}
else
return false;//没有正确匹配
}
}
}
}
//判断栈是否为空
return stackEmpty(&st);
}