20. 有效的括号

34 阅读1分钟

20. 有效的括号

简单

相关标签

premium lock icon相关企业

提示

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

 

示例 1:

输入: s = "()"

输出: true

示例 2:

输入: s = "()[]{}"

输出: true

示例 3:

输入: s = "(]"

输出: false

示例 4:

输入: s = "([])"

输出: true

示例 5:

输入: s = "([)]"

输出: false

 

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

题解:

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;
}