首页 > 其他 > 详细

括号匹配

时间:2014-03-23 12:33:11      阅读:470      评论:0      收藏:0      [点我收藏+]
bubuko.com,布布扣
#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()) != \n)
    {
        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;
}
bubuko.com,布布扣

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

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

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

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

一共四种情况:

([]) 

[[))

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

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

 

 

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

使用c++ STL的情况

bubuko.com,布布扣
#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;
}
bubuko.com,布布扣

括号匹配,布布扣,bubuko.com

括号匹配

原文:http://www.cnblogs.com/virusdefender/p/3618660.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!