给定一个只包括 (
,)
,{
,}
,[
,]
的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
https://leetcode-cn.com/problems/valid-parentheses/description/
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
这道题用栈的思想解决问题
遇到左边的符号入栈
遇到右边的符号判断栈顶元素与之是否匹配,匹配–出栈,不匹配-失败完成之后判断栈是否为空,为空匹配,否则不匹配
栈的实现
typedef int STDataType;
typedef struct Stack
{
STDataType *_a;//指针
int _top;//栈顶的下一个元素
int _capacity;//容量
}Stack;
void StackInit(Stack *ps, int n)
{
assert(ps);
ps->_a = (STDataType *)malloc(sizeof(STDataType)*n);
//开辟空间是否成功
assert(ps->_a);
ps->_capacity = n;
ps->_top = 0;
}
void StackDestory(Stack *ps)
{
assert(ps);
if (ps->_top)
{
free(ps->_a);
ps->_a = NULL;
ps->_top = 0;
ps->_capacity = 0;
}
}
void StackPush(Stack *ps, STDataType x)
{
assert(ps);
//判断容量是否满
if (ps->_top == ps->_capacity)
{
ps->_a = (STDataType *)realloc(ps->_a, sizeof(STDataType)*ps->_capacity * 2);
ps->_capacity *= 2;
}
ps->_a[ps->_top] = x;
ps->_top++;
}
void StackPop(Stack *ps)
{
assert(ps);
//判断还有没有数据可删
if (ps->_top > 0)
{
ps->_top--;
}
}
STDataType StackTop(Stack *ps)
{
assert(ps);
return ps->_a[ps->_top - 1];
}
int StackSize(Stack *ps)
{
assert(ps);
return ps->_top;
}
int StackEmpty(Stack *ps)
{
assert(ps);
return ps->_top == 0 ? 0 : 1;
}
括号的匹配(1)通用性不强
bool isValid(char* s) {
Stack ps;
StackInit(&ps, 10);
while(*s!='\0')
{
if(*s == '{' || *s == '[' || *s == '(' )
{
StackPush(&ps, *s);
}
//如果第一个符号为左符号,不匹配
//")"
else if(StackEmpty(&ps) == 0)
{
return false;
}
else if(*s == '}')
{
if(StackTop(&ps) == '{')
StackPop(&ps);
else
return false;
}
else if(*s == ')')
{
if(StackTop(&ps) == '(')
StackPop(&ps);
else
return false;
}
else if(*s == ']')
{
if(StackTop(&ps) == '[')
StackPop(&ps);
else
return false;
}
else
return false;
s++;
}
//判断栈是否为空
if(StackEmpty(&ps) == 0)
return true;
else
return false;
}
括号的匹配(2)
bool isValid(char* s) {
char arr[][2]={{'(', ')'},
{'[', ']'},
{'{', '}'}};
Stack ps;
StackInit(&ps, 10);
while(*s!='\0')
{
int i=0;
//找到有符号,即[i][0]
for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
if(*s==arr[i][0])
{
StackPush(&ps,*s);
s++;
break;
}
}
//是右符号,从break跳出来
if(i!=3)
continue;
//不是右符号,i = 3,是左符号,判断是否匹配
for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
//判断是哪一个右符号[i][1]
if(arr[i][1]==*s)
{
//与栈顶元素比较,匹配出栈,不匹配false
char ch=StackTop(&ps);
if( ch==arr[i][0])
{
StackPop(&ps);
break;
}
else
return false;
}
}
s++;
}
//判断栈是否为空
if(StackEmpty(&ps) == 0)
return true;
//"([]"
else
return false;
}