题目:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
思路:
1.使用语言:c
2.实现运用的知识: 栈的后进先出
3.大概实现:遍历字符串,让左括号入栈。如遇上右括号,则判断栈顶的数据是否为与之匹配的左括号(1.栈为空则不满足条件;2.括号不匹配也不满足),判断完后,将栈顶的数据做出栈操作。
4.遍历完字符串还需判断栈是否为空,不为空则说明存在不匹配的括号。
以下是代码实现
1.需注意的是:栈要自己实现。
#define SDataType char
typedef struct Stack
{
int _top; // _top表示栈最后一个元素的位置
SDataType _array[4000];
int _capacity;
}Stack;
//初始化栈
void InitStack(Stack* pStack)
{
assert(pStack);
pStack->_top = 0; //栈内无元素,初始化栈顶位置为零;
pStack->_capacity = 4000;
}
//入栈(插入元素)
void PushStack(Stack* pStack, SDataType x)
{
assert(pStack);
pStack->_array[pStack->_top] = x;
pStack->_top++;
}
//出栈(删除元素)
void PopStack(Stack* pStack)
{
assert(pStack);
if (pStack->_top == 0)
{
printf("该堆已删空 ");
exit(1);
}
pStack->_top--;
}
//获取栈顶元素
SDataType StackTop(Stack* pStack)
{
assert(pStack);
if (pStack->_top == 0)
{
printf("无数据获取!\n");
exit(-1);
}
return pStack->_array[pStack->_top - 1];
}
//栈是否为空(是返回true,否返回false)
bool EmptyStack(Stack* pStack)
{
assert(pStack);
if (pStack->_top == 0)
{
return true;
}
return false;
}
bool isValid(char * s){
Stack st ;
InitStack(&st);
int ret = 0 ;
while(*s != '\0')
{
//左括号进队列
if( (*s == '(') || (*s == '[') || (*s == '{'))
PushStack(&st,*s);
else
{
if(EmptyStack(&st))//栈为空说明里面无左括号,不满足条件。
{
return false;
}
if(*s == ')' && StackTop(&st) != '(')
{
return false;
}
if(*s == '}' && StackTop(&st) != '{')
{
return false;
}
if(*s == ']' && StackTop(&st) != '[')
{
return false;;
}
PopStack(&st);
}
++s;
}
//遍历完如果栈内无元素,说明所有括号匹配,返回ture;反之返回false;
return EmptyStack(&st);
}