括号匹配

#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

原文地址:https://www.cnblogs.com/virusdefender/p/3618660.html