zoukankan      html  css  js  c++  java
  • 括号匹配

    #include <stdio.h>
    #include <stdlib.h>
    
    #define BASE_SIZE 5000
    struct bracket_stack
    {
        char bracket[BASE_SIZE];
        int top;
    };
    
    void init_stack(struct bracket_stack **p)
    {
        *p = (struct bracket_stack *)malloc(sizeof(struct bracket_stack));
        (*p) ->top = -1;
    }
    
    int is_empty(struct bracket_stack *p)
    {
        return p->top == -1;
    }
    
    void push(struct bracket_stack **p, char c)
    {
        (*p)->top++;
        (*p)->bracket[(*p)->top] = c;
    }
    
    char get_top(struct bracket_stack *p)
    {
        return p->bracket[p->top];
    }
    
    char pop(struct bracket_stack *p)
    {
        p->top--;
        return p->bracket[p->top + 1];
    }
    
    int main()
    {
        struct bracket_stack *s;
        char c;
        init_stack(&s);
        while ((c = getchar()) != '
    ')
        {
            if (c == '(' || c == '[')
            {
                push(&s, c);
            }
            if (c == ')')
            {
                if (!is_empty(s) && get_top(s) == '(')
                {
                    pop(s);
                }
                else
                {
                    printf("不匹配");
                    return 0;
                }
            }
            if (c == ']')
            {
                if (!is_empty(s) && get_top(s) == '[')
                {
                    pop(s);
                }
                else
                {
                    printf("不匹配");
                    return 0;
                }
            }
        }
        if (!is_empty(s))
        {
            printf("不匹配");
        }
        else
        {
            printf("匹配");
        }
        return 0;
    }

    首先是遍历字符串,如果是左括号,就压栈。

    如果是右括号,就去看栈顶元素是都匹配,但是看栈顶元素之前要先判断栈是不是空的。

    如果是匹配的,就弹栈,看下一个括号;如果不匹配,就肯定不匹配,不用往下看了。

    最后看栈是否为空的,如果不为空就是左括号多了,肯定不匹配。

    一共四种情况:

    ([]) 

    [[))

    [[[[]]]]]]]]]]]]

    [[[[[[[[[[[[[[[[[]]]]

    ------------------

    使用c++ STL的情况

    #include <iostream>
    #include <stack>
    #include <string>
    
    using namespace std;
    
    int main()
    {
        stack<char> s;
        string str;
        cin >> str;
        for (int i = 0; i < str.size();i++)
        {
            if (str[i] == '(' || str[i] == '[')
            {
                s.push(str[i]);
            }
            if (str[i] == ')')
            {
                if (!s.empty() && s.top() == '(')
                {
                    s.pop();
                }
                else
                {
                    cout << "不匹配" << endl;
                    return 0;
                }
            }
            if (str[i] == ']')
            {
                if (!s.empty() && s.top() == '[')
                {
                    s.pop();
                }
                else
                {
                    cout << "不匹配" << endl;
                    return 0;
                }
            }
        }
        if (s.empty())
        {
            cout << "匹配" << endl;
        }
        else
        {
            cout << "不匹配" << endl;
        }
    
        return 0;
    }

    ---------------

    Issues:

    非stl的那种,其实没有必要去使用二级指针

    []()这种也是提示匹配的,但是应该匹配么?

    malloc后没有free

  • 相关阅读:
    【02】SASS与SCSS
    【02】sass更新的方法
    10.19 dig:域名查询工具
    10.7 netstat:查看网络状态
    10.6 ip:网络配置工具
    S11 Linux系统管理命令
    11.19 rpm:RPM包管理器
    11.20 yum:自动化RPM包管理工具
    11.2 uptime:显示系统的运行时间及负载
    11.3 free:查看系统内存信息
  • 原文地址:https://www.cnblogs.com/virusdefender/p/3618660.html
Copyright © 2011-2022 走看看