美文网首页
【数据结构】【C#】010-栈的应用:🌜🌛括号匹配

【数据结构】【C#】010-栈的应用:🌜🌛括号匹配

作者: lijianfex | 来源:发表于2018-10-13 13:34 被阅读30次

C#数据结构:栈的应用:括号匹配问题

假设表达式中包含三种括号:圆括号、方括号和花括号,它们可互相嵌套,如 ( [ { } ]( [ ] ) )或( { ( [ ] [ ( ) ] ) } )等均为正确的格式,而 { [ ] } ) }或 { [ ( ) ] 或 ( [ ] }均为不正确的格式。

算法描述:

1.首先校验输入的括号字符是否空
2.创建一个空栈用来存储左括号
3.循环读取括号字符串,当读到左括号时,将其入栈,当读到右括号,则将右括号与栈顶左括号进行类型匹配,匹配成功则将左括出栈,否则就是为非法情况。
4.当所有的括号读取完成后,若左括号栈同时也为空了,表明匹配成功,不为空,表明左括号多余。

算法实现:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class StackAppliction
{

    /// <summary>
    /// 括号匹配算法(栈的应用)
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public bool BracketMatch(string str)
    {
        Debug.Log(str);

        if (str == string.Empty||str==null)//校验字符括号是否为空
        {
            Debug.Log("字符括号为空!匹配失败!");
            return false;
        }

        LinkStack<char> stack = new LinkStack<char>(); //用来存储左括号(此处使用了之前自己定义的链栈结构)
        //Stack<char> stack = new Stack<char>();//系统提供的栈

        for (int i = 0; i < str.Length; i++)//读取括号字符串
        {
            switch (str[i])
            {
                case '(':
                case '[':
                case '{':
                    stack.Push(str[i]);//左括号进栈
                    break;
                case ')':
                case ']':
                case '}':
                    if (stack.IsEmpty())//使用系统提供的栈:stack.Count==0
                    {
                        Debug.Log("右括号   " + str[i] + "  多余!匹配失败!");
                        return false;
                    }
                    else
                    {
                        char left = stack.Peek();//访问左括号栈顶值

                        if (Match(left, str[i])) //判断左右括号类型
                        {
                            stack.Pop(); //匹配成功,出栈顶值
                        }
                        else
                        {
                            Debug.Log("左括号:  " + left + "  与右括号:   " + str[i] + "   不同类型!匹配失败! ");
                            return false;
                        }
                    }
                    break;
                default:
                     break;
            }
        }

        if (stack.IsEmpty())//使用系统提供的栈:stack.Count==0
        {
            Debug.Log("匹配成功!");
            return true;
        }
        
        Debug.Log("左括号:  " + stack.Peek() + "   多余!匹配失败!");
        return false;

    }


    /// <summary>
    /// 判断左括号与右括号是否同类型
    /// </summary>
    /// <param name="l">左括号</param>
    /// <param name="r">右括号</param>
    /// <returns></returns>
    private bool Match(char l, char r)
    {
        if ((l == '(') && (r == ')'))
        {
            return true;
        }
        if ((l == '[') && (r == ']'))
        {
            return true;
        }
        if ((l == '{') && (r == '}'))
        {
            return true;
        }
        return false;

    }
}

算法测试:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class _010_StackAppliction : MonoBehaviour
{

    void Start()
    {


        StackAppliction appliction = new StackAppliction();

        print(appliction.BracketMatch(null));

        print(appliction.BracketMatch(""));

        print(appliction.BracketMatch("({})"));

        print(appliction.BracketMatch("({fsd[f}af)"));

        print(appliction.BracketMatch("(af{af}"));

        print(appliction.BracketMatch("af{af}sf)af"));

        print(appliction.BracketMatch("(dfgd{q)"));

        print("判断是否平衡圆括号---------------");

        print("是否平衡圆括号:"+appliction.BracketMatch("()()"));
        print("是否平衡圆括号:" + appliction.BracketMatch("())"));
        print("是否平衡圆括号:" + appliction.BracketMatch("(((((())))))"));

    }
}

输出结果:


img.jpg

相关文章

  • 【数据结构】【C#】010-栈的应用:🌜🌛括号匹配

    C#数据结构:栈的应用:括号匹配问题 假设表达式中包含三种括号:圆括号、方括号和花括号,它们可互相嵌套,如 ( [...

  • 20. Valid Parentheses

    使用栈数据结构: 遇到左括号,需要压栈。 遇到右括号,判断栈顶是否和当前右括号匹配;若不匹配则返回false,否则...

  • 栈应用:括号匹配

    GitHub:https://github.com/BadWaka/data-structure-algorith...

  • 如何用数组来实现栈和队列

    Stack 栈是一种后入先出的数据结构,仅限定在栈顶进行插入和删除操作。栈结构的实际应用主要有数制转换、括号匹配、...

  • 栈的应用:括号匹配

    题目:给定一个字符串,其中的字符只包含三种括号:花括号{ }、中括号[ ]、圆括号( ),即它仅由 “( ) [ ...

  • 栈的应用---括号匹配

    stack.h main.c

  • 栈的应用

    动态数组的子集 栈的应用undo.png leetcode括号匹配:

  • 2019-05-12(栈应用 括号匹配 leetcode 20

    括号匹配思路: 1、遇到左边的括号 进栈 ,2、遇到右边的括号获取原来栈 中栈顶元素,与刚遇到的值进行匹配,匹配成...

  • 栈: 顺序栈 栈的应用:函数调用栈,表达式求值,括号匹配,浏览器的前进后退。相关code:https://gith...

  • chap3-栈和队列

    括号匹配问题 // 括号匹配,遇到 '\0' 结束// 遇到花、中、圆左括号进栈,遇到花、中、圆右括号检查栈顶元素...

网友评论

      本文标题:【数据结构】【C#】010-栈的应用:🌜🌛括号匹配

      本文链接:https://www.haomeiwen.com/subject/radoaftx.html