必威体育Betway必威体育官网
当前位置:首页 > IT技术

用栈解决----括号匹配问题(MatchBrackets)

时间:2019-07-26 02:44:25来源:IT技术作者:seo实验室小编阅读:69次「手机版」
 

括号匹配

问题:给出一个字符数组,判断里边的括号是否匹配。

分析:首先我们要确定用什么方法来解决这个问题,然后再进一步分析过程。

我们可以用栈来解决这个问题,如果是左括号我们就让它入栈,如果是右括号,我们先要判断它和栈顶元素(左括号)是否匹配,如果匹配,我们就让左括号出栈,依次进行,直到栈空时结束,当然如果在前边如果出现匹配不正确,我们直接返回,不用再向后进行了。

栈的特点:后进先出

这里写图片描述

好了,这个过程我们已经分析完了,我们就来看看代码吧,其实语言并不难,难的只是一个问题的分析过程,只要我们把这个问题分析清楚了,只要用语言把这个过程翻译过来就行。

MatchBrackets.h//头文件

#ifndef __MATCHBRACKETS_H__
#define __MATCHBRACKETS_H__

#include<stdio.h>
#include<assert.h>
#include<string.h>

#define MaxSize 20

typedef char SDataType;
typedef struct Stack
{
    int top;
    SDataType _arry[MaxSize];
}Stack;

void MatchBrackets(Stack* ps, int sz);
int IsBrackets(char arry[], int i);
int StackSize(Stack* ps);
void StackPush(Stack* ps, SDataType data, char arry[]);
void StackPop(Stack* ps);
int Stackempty(Stack* ps);
void StackInit(Stack* ps);

#endif //__MATCHBRACKETS_H__

MatchBrackets.c//源文件

#include"MatchBrackets.h"

int IsBrackets(char arry[], int i)
{
    if (('(' == arry[i]) || (')' == arry[i]) || ('[' == arry[i]) || (']' == arry[i]) || ('{' == arry[i]) || ('}' == arry[i]))
        return 1;//是括号
    else
        return 0;
}

int StackSize(Stack* ps)
{
    assert(ps != NULL);
    return ps->top;
}

void StackPush(Stack* ps, SDataType data)
{
    assert(ps != NULL);
    if (ps->top == MaxSize)
        return;
    else
    {
        ps->_arry[ps->top] = data;
        ps->top++;
    }
}

void StackPop(Stack* ps)
{
    assert(ps != NULL);
    if (ps->top)
        ps->top--;

}

int StackEmpty(Stack* ps)
{
    assert(ps != NULL);
    if (0 == ps->top)
        return 1;
    else
        return 0;
}

void StackInit(Stack* ps)
{
    assert(ps != NULL);
    ps->top = 0;
}

void MatchBrackets(Stack* ps, int sz, char arry[])
{
    int i = 0;
    int k = 0;//因为传的是指针,所以要定义一个形参
    assert(ps != NULL);
    //char ch = 0;
    while (i < sz)
    {
        if (IsBrackets(arry, i))//是括号
        {
            //如果是左括号,入栈
            if (('(' == arry[i]) || ('[' == arry[i]) || ('{' == arry[i]))
            {
                StackPush(ps, arry[i]);
                i++;
                continue;
            }
            else if ((')' == arry[i]) || (']' == arry[i]) || ('}' == arry[i]))
            {
                if (0 == ps->top)  //判断栈是否为空,若为空,则右括号比左括号多
                {
                    printf("右括号比左括号多!\n");
                    return;
                }
                else
                {
                    k = ps->top;
                    char ch = ps->_arry[--k];//ERROR:ch = ps->_arry[--(ps->top)]---因为ps->top已经减1了,传递是指针,所以实参ps->top也-1了(此时ps->top已经指向栈顶了),但在下边要出栈(先-1,再出栈,出的就不是栈顶指针了,就会出错,所以我们要定义一个形参k,对形参的改变不会引起对实参的改变),
                    //如果右括号与左括号匹配,左括号出栈
                    if (((')' == arry[i]) && ('(' == ch)) ||
                        ((']' == arry[i]) && ('[' == ch)) ||
                        (('}' == arry[i]) && ('{' == ch)))
                    {

                        StackPop(ps);
                        i++;
                        continue;
                    }
                    else
                    {
                        printf("括号匹配出错!\n");
                        return;
                    }
                }
            }
        }
        else   //不是括号,不用操作,直接向后走
        {
            i++;
        }
    }
    if (!StackEmpty(ps))
    {
        printf("左括号比右括号多!\n");
    }
    else
    {
        printf("匹配正确!\n");
    }

}

这里写图片描述

test.c//测试文件

#include"MatchBrackets.h"

int main()
{
    Stack s;
    int sz = 0;
    StackInit(&s);
    char a[] = "(())abc{[(])}";//左右括号次序匹配不正确
    char b[] = "(()))abc{[]}";//右括号多于左括号
    char c[] = "(()()abc{[]}";//左括号多于右括号
    char d[] = "(())abc{[]()}";//左右括号匹配正确

    sz = strlen(c);

    MatchBrackets(&s, sz, c);

    return 0;
}

这里写图片描述

经测试,运行结果正确。

相关阅读

【数据结构】括号匹配问题

给定一个字符串,其中的字符只包含三种括号:花括号{ }、中括号[ ]、圆括号( ),即它仅由 “( ) [ ] { }” 这六个字符组成。设计算法,判

scala map 小括号与大括号

原文地址:http://hongjiang.info/scala-pitfalls-2/spark编程的时候的时候看到这样的一个用法:作为接触scala两天半的我有些看不明

excel函数中大括号的用法

Excel中大括号具体该如何使用呢?下面是由seo实验室小编分享的excel 函数中大括号的用法法,以供大家阅读和学习。excel 函数中大括

特殊符号大全(标点符号/括号等)

■特殊符号:&middot;⊙①?◎&Theta;⊙●○&curren;㊣㈱@の■□★☆◆◇◣◢ ◤◥▲△▼▽⊿◢▂ ▃ ▄ ▅ ▆ ▇ █ ▉ ▊▋▌▍▎

分享到:

栏目导航

推荐阅读

热门阅读