数据结构 03-栈的应用:括号匹配的代码实现

目     录

1. 栈的应用场景

1.1 实际应用场景

1.2 例题分类

2. 应用场景:括号匹配

2.1 括号匹配例题

2.2 括号匹配代码实现

2.2.1 未使用栈的代码实现

2.2.2 使用栈的代码实现


1. 栈的应用场景

1.1 实际应用场景

        总的来说,栈的运用还是非常广泛的,在实际的编程场景中,支持文本编辑器、字处理程序、电子表格程序、绘图程序或类似的应用程序中的撤销功能,支持维护 Web 浏览器所访问过的连接的历史记录。

1.2 例题分类

        常见的例题有下面四种,会依次进行讲解,本章先讲括号匹配。

  1. 括号匹配
  2. 数制转换
  3. 迷宫求解
  4. 表达式求值

2. 应用场景:括号匹配

2.1 括号匹配例题

        例题参看:20. 有效的括号 - 力扣(LeetCode)

        例题内容:

        给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

        有效字符串需满足:

                左括号必须用相同类型的右括号闭合。
                左括号必须以正确的顺序闭合。

2.2 括号匹配代码实现

2.2.1 未使用栈的代码实现

        这部分并没有直接使用栈结构,在依次判断存放了括号列表的元素时候,遇到左右匹配的就从列表中移除,然后不断地对列表进行扫描。

class Solution:
    def isValid(self, s: str) -> bool:
        left_right={"(":")","{":"}","[":"]"}
        s_list=list(s)
        s_len=len(s_list)
        while(s_len>0):
            i=0
            found=False
            while(i<s_len-1):
                if((s_list[i] in left_right) and left_right[s_list[i]]==s_list[i+1]):
                    found=True
                    s_list.pop(i)
                    s_list.pop(i)
                    break
                i+=1
            if(not found):
                return(False)
            s_len=len(s_list)
        return(True)

运行结果:

2.2.2 使用栈的代码实现

        使用栈时候,只需要在压栈的时候判断一下是否和目前栈顶元素是一对,如果是则双双消除,如果不是和压栈,最后看看栈的长度是不是为0就可以了,相对于不使用栈结构的代码,非常的清晰。

class Solution:
    def isValid(self, s: str) -> bool:
        stack=Stack()
        for tmp in s:
            stack.push(tmp)
        if(stack.is_empty()):
            return(True)
        else:
            return(False)

            

class Stack(object):
    def __init__(self):
        self.stack=[]
        self.stack_size=0
        self.content={"(":")","{":"}","[":"]"}

    # 压栈
    def push(self,val):
        if(self.stack_size>0):
            if((self.stack[-1] in self.content  ) and (self.content[self.stack[-1] ]==val)):
                self.pop()
                return(False)
        self.stack.append(val)
        self.stack_size+=1
        return(True)
    
    # 弹出栈顶元素
    def pop(self):
        if(self.stack_size==0):
            return(None)
        else:
            self.stack_size-=1
            return(self.stack.pop())
    

        
    # 判断栈是否为空
    def is_empty(self):
        if(self.stack_size==0):
            return(True)
        else:
            return(False)
        
    
    # 提供给 print 函数
    def __str__(self):
        return("This is a stack ==>{0}".format(self.stack))    

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南野栀子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值