栈的应用之括号匹配问题

用数据结构判断括号匹配
博客围绕判断括号序列是否合法展开,指出合法的括号匹配序列需每个左括号都有右括号配对,提出用一种数据结构来判断不同括号序列是否匹配,并包含思路讲解和代码实现。

【题目描述】
如果一个括号序列中的每个左括号都有一个右括号与之完成配对,这个序列就是一个合法的括号匹配序列。
例如:

char a[] = "(())abc{[(])}";//左右括号匹配不正确
char b[] = "(()))abc{[]}";//右括号多于左括号
char c[] = "(()()abc{[]}";//左括号多于右括号
char d[] = "(())abc{[]}";//左右括号匹配正确

请用一种数据结构判断出以上四个不同序列的括号是否匹配。

【思路讲解】
这里写图片描述

【代码实现】

int MatchBrackets(Stack s, const char* pStr)//括号匹配(if实现)
{
    int i = 0;
    int len = 0;
    DataType e;
    if (NULL == pStr)//判断括号表达式是否为空
    {
        return 0;
    }
    len = strlen(pStr);//求括号表达式长度
    for (i = 0; i <len; ++i)
    {
        if (!IsBrackets(pStr[i]))//判断 i 位置上的字符是否为括号
        {
            continue;//不是,继续取下一个字符
        }
        else//是括号
        {
            if (('(' == pStr[i]) || ('[' == pStr[i]) || ('{' == pStr[i]))//左括号
            {
                StackPush(&s, pStr[i]);//入栈
                continue;
            }
            else//右括号
            {
                if (StackEmpty(&s))//栈若为空
                {
                    printf("右括号比左括号多\n");
                    return 0;
                }
                else//栈中有左括号
                {
                    char Top = 0;
                    Top=StackTop(&s,&e);//获取栈顶元素
                    if ((Top == '(')&&(pStr[i] == ')'))//判断栈顶是否和 i 位置上的右括号匹配
                    {
                        StackPop(&s);
                        continue;
                    }
                    else if ((Top == '[')&&(pStr[i] == ']'))
                    {
                        StackPop(&s);
                        continue;
                    }
                    else if ((Top == '{')&&(pStr[i] == '}'))
                    {
                        StackPop(&s);
                        continue;
                    }
                    else//不匹配
                    {
                        printf("左右括号次序匹配不正确\n");
                        return 0;
                    }
                }
            }
            continue;
        }
    }
    if (StackEmpty(&s))
    {
        printf("括号匹配\n");
    }
    else
    {
        printf("左括号多于右括号\n");
    }
}

int IsBrackets(char c)//判断字符是否为括号
{
    if (('(' == c) ||( '[' == c) || ('{' == c) ||( ')' == c) ||( ']' == c) ||( '}' == c))
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
在Python中,有多种方式可以实现,同时可以用于解决括号匹配问题。 ### Python实现 Python实现有三种常见方式,分别是使用列表、`collections.deque` 和 `queue.LifoQueue`。 1. **使用列表实现** ```python stack = [] # 入操作 stack.append(1) stack.append(2) # 出操作 top_element = stack.pop() print(top_element) # 输出 2 ``` 2. **使用 `collections.deque` 实现** ```python from collections import deque stack = deque() # 入操作 stack.append(1) stack.append(2) # 出操作 top_element = stack.pop() print(top_element) # 输出 2 ``` 3. **使用 `queue.LifoQueue` 实现** ```python from queue import LifoQueue stack = LifoQueue() # 入操作 stack.put(1) stack.put(2) # 出操作 top_element = stack.get() print(top_element) # 输出 2 ``` ### 应用解决括号匹配问题 以列表实现为例,代码如下: ```python class Stack: def __init__(self, size): self.items = [] self.size = size def is_empty(self): return len(self.items) == 0 def push(self, item): if len(self.items) < self.size: self.items.append(item) def pop(self): if not self.is_empty(): return self.items.pop() def Pan(string): a = Stack(len(string)) for i in string: if i == "(": a.push(i) elif i == ")": if a.is_empty(): return False a.pop() return a.is_empty() if __name__ == '__main__': string = input() if Pan(string): print("括号匹配") else: print('括号不匹配') ``` 这段代码实现了的基本操作,并使用来判断输入字符串中的括号是否匹配。当输入的字符串中括号括号能正确闭合时,输出“括号匹配”,否则输出“括号不匹配” [^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值