Leetcode 之判断字符串是否有效及栈结构
admin
2023-06-26 18:03:01
0

  在考虑这个问题前,我们首先复习数据结构中的栈,因为编译器中括号匹配就是通过栈来实现的:

  栈:

  栈:是一种先进后出的数据结构;其本质也就有特殊限制的链表(先进后出,栈顶),提起栈我们首先会想到什么呢?当然是进栈(push)和出栈(pop),下面我们通过代码来实现进栈和出栈过程:

  我们要重视栈顶这个部分:栈顶(top),我们要保证栈顶只有一个节点,并且链接到下面的节点,具体的实现方式是,构建一个新节点,把新节点的next(指针)指向原先的栈顶,再把栈顶设置为新节点。如下面代码所示。

  #建立栈结构 push 和 pop

  #首先定义listnode

  class node(object):

  def __init__(self,value=None):

  self.value=value

  self.next=None

  class stack(object):

  def __init__(self):

  self.node=node()

  self.top=[self.node]

  def push(self,elem):

  new_node=node(elem)

  if self.top[0].value==None:

  new_node.next=None

  else:

  new_node.next=self.top[0]

  self.top.append(new_node)

  self.top.pop(0)

  def pop(self):

  try:

  value_top=self.top[0].value

  node=self.top[0].next

  self.top.append(node)

  self.top.pop(0)

  return value_top

  except:

  print('wrong')

  s=stack()

  for i in ['a','b','c','d']:

  s.push(i)

  for i in range(4):

  print(s.pop())

  问题和问题分析

  问题来源于leetcode,

  这个问题可以说非常重要,因为我们程序编译器中常常要检查括号是否配对,如果我们能够真正了解这个原理,能够有助于我们深入了解编译器原理:

  我们首先考虑简单的情况:当所有括号类型相同的时候,我们只需要让每个左括号都有一个右括号与其匹配就可以,总结来说,我们将左括号计数(left)有如下公式:

  left++left++left++

  我们考虑遇到右括号时,left的不同情况:

  left=0 说明没有和右括号相匹配的左括号,即表达式是invaild

  left>0,我们有与右括号相匹配的左括号,此时匹配我们要将left−−left--left−−

  如果遍历完所有的符号后,left!=0,说明表达式依旧是invalid

  总而言之,我们只需要计数左括号,看是否有与之匹配的右括号,但是这仅仅是简单的情况,没有考虑到不同符号之间的相对位置,如果是如下这样的表达式,我们上面总结的规律就不满足了:

  ({)}

  进一步考虑

  根据一个有趣的规律:郑州妇科医院 http://www.ytsgfk120.com/

  关于有效括号表达式的一个有趣属性是有效表达式的子表达式也应该是有效表达式。(不是每个子表达式)。

  从这里我们看出是递归的,也就是如果每个子表达式是有效的表达式,整个表达式就是有效的,这样我们就可以从解决每个子表达式出发,当表达式匹配就删除,直至剩下空的表达式说明了表达式是有效的:算法流程如下:

  遇到左括号将其压入栈。

  遇到右括号,将栈顶推出,如果与栈顶相匹配,继续进行,如果不匹配,则可以判断整个表达式无效(invaild)。

  如果最后栈空就说明了,表达式有效,代码如下,用字典的数据结构有助于我们降低复杂度:

  #建立栈结构 push 和 pop

  #首先定义listnode

  class node(object):

  def __init__(self,value=None):

  self.value=value

  self.next=None

  class stack(object):

  def __init__(self):

  self.top=None

  def push(self,elem):

  new_node=node(elem)

  if self.top==None:

  new_node.next=None

  else:

  new_node.next=self.top

  self.top=new_node

  def pop(self):

  if self.top!=None:

  value_top=self.top.value

  node=self.top.next

  self.top=node

  return value_top

  else:

  return False

  string='()'

  dict_={'}':'{',']':'[',')':'('}

  def judge_str(str_,dict_):

  s=stack()

  for i in str_:

  if i in dict_:

  result=s.pop() if s.top else '#'

  if (result!=dict_[i]):

  return False

  else:

  s.push(i)

  if s.top==None:

  return True

  else:

  return False

  judge_str(string,dict_)

  总结

  总结而言,我们括号匹配是一种递归结构,如果每个子表达式匹配,那么整个表达式也匹配,用栈结构来实现它,按照以上总结的规律,用字典格式可以很快很好的解决问题.

  遇到左括号将其压入栈。

  遇到右括号,将栈顶推出,如果与栈顶相匹配,继续进行,如果不匹配,则可以判断整个表达式无效(invaild)


上一篇:Opencv基础

下一篇:常用正则表达式

相关内容

热门资讯

美民调:超半数美国人称生活成本... 据凤凰卫视报道,美国政治新闻网5月29日公布的最新民调显示,美国选民仍然不满意总统特朗普的经济政策,...
燃气灶开关无法控制怎么办 燃气灶开关无法控制,这是一种非常危险的情况。这种情况可能会导致燃气泄漏和火灾等严重后果。如果您遇到这...
为什么海尔冰箱冷冻室温度显示一... 这种情况表示的是超温报警灯亮了。也就是说冰箱的冷冻室温度没有降下去,冷冻室温度降到零下8度左右就自动...
西门子冰箱冷冻室温度一直闪烁是... 1、有可能是因为操作不当导致的情况;2、有可能是西门子冰箱显示屏的供电电源或显示屏本身的故障。 ...
冰雪儿点菜柜冷冻室温度灯一直闪 1、可能是因为冰雪儿点菜柜的压缩机遭到了损坏。 2、可能是因为点菜柜的内部电路发生了断路。3、可能是...
海尔冰箱冷冻温度一直闪怎么解决 一直闪可能是超温报警灯亮了,这说明冷冻室的温度出现了异常,一般是温度过高造成的报警,看看冷冻室是否关...
健康证上标注“女性私密”?越界... 南方都市报29日报道,深圳一市民陈某(化名)在深圳市南山区妇幼保健院办理托幼岗位健康证时遭遇乱象。据...
2026香格里拉对话会开幕,中... 第23届香格里拉对话会5月29日晚在新加坡开幕,来自40多个国家和地区的政要、防务官员和专家学者等共...
美国中期选举:谁是骄兵必败,谁... 【文/观察者网专栏作者 周德宇】从特朗普二次执政以来,其民调可以说是一路雪崩,连累着共和党也一起遭殃...
芗城区科协开展全国科技工作者日... 5月27日,芗城区科协联合东铺头街道、瑞京社区等单位,走进芗城实幼东铺头园区,开展芗城区全国科技工作...