简单
相关标签
相关企业
提示
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入: s = "()"
输出: true
示例 2:
输入: s = "()[]{}"
输出: true
示例 3:
输入: s = "(]"
输出: false
示例 4:
输入: s = "([])"
输出: true
示例 5:
输入: s = "([)]"
输出: false
提示:
1 <= s.length <= 104s仅由括号'()[]{}'组成
题解:
bug:入栈出栈函数中*top ++;应该要给*top加括号。变成(*top) ++;修改后,top指针的变化正常。
bug:拿到右括号,要访问栈顶元素是否是左括号,访问栈顶元素时候应该先判断栈是否为空。
bug:数组名就是首地址,传入函数直接传入数组名即可,scanf也直接写数组名,两者都不用加&。
push是压入栈,pop是弹出栈,记反了。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void pushstack(char* stack, int* top, char s)
{
(*top) ++;
stack[*top] = s;
}
void popstack(char* stack, int* top)
{
(*top) --;
}
int stackempty(char* stack, int* top)
{
if ((*top) == -1)
{
return 1;
}
else return 0;
}
int main()
{
int i, top = -1, size;
char str[10000] = {'\0'};
char stack[10000] = {'\0'};
scanf("%s", str);
size = strlen(str);
for (i = 0;i <= size - 1;i ++)
{
if (str[i] == '(' || str[i] == '[' || str[i] == '{')
{
pushstack(stack, &top, str[i]);
}
else if (str[i] == ')')
{
if (stackempty(stack, &top) == 0 && stack[top] == '(')
{
popstack(stack, &top);
}
else
{
printf("false");
return 0;
}
}
else if (str[i] == ']')
{
if (stackempty(stack, &top) == 0 && stack[top] == '[')
{
popstack(stack, &top);
}
else
{
printf("false");
return 0;
}
}
else if (str[i] == '}')
{
if (stackempty(stack, &top) == 0 && stack[top] == '{')
{
popstack(stack, &top);
}
else
{
printf("false");
return 0;
}
}
}
if (stackempty(stack, &top) == 1)
{
printf("true");
}
else printf("false");
return 0;
}