【问题标题】:using python 3 stacks to ensure symbols match in correct pairs and the types of symbols match as well使用 python 3 堆栈确保符号匹配正确,并且符号类型也匹配
【发布时间】:2018-05-05 12:35:48
【问题描述】:
def spc(sym):
    stk1=myStack()
    stkall=myStack()
    for i in sym:
        if i not in stk1:
            stk1.push(i)
        else:
            stkall.push(i)
    for j in stk1:
        for k in stkall:
            if j==k:
                stk1.pop(j)
                stkall.pop(k)
            else:
                pass
    if len(stk1) == len(stkall):
        print("all symbols match")
    else:
        print(("these symbols, %s,  have no matches")%(stkall))

上面的代码给了我这个错误
“TypeError:'myStack' 类型的参数不可迭代”

但我通过@SergeBallesta 的回答修复了它。在我将代码编辑为您现在看到的样子之后。

现在我得到这个错误:

"return self.container.pop(item) # 从容器中弹出,这是从旧版本修复的错误 TypeError: 'str' 对象不能被解释为整数"

我想要实现的是括号和所有符号的适当平衡,因为不仅每个开始符号都有一个对应的结束符号,而且符号的类型也匹配。

我的 Stack 类的代码如下。请协助使用 STACKS 实现此功能

class myStack:
    def __init__(self):
        self.container = []
    def isEmpty(self):
        return self.size() == 0
    def push(self, item):
        self.container.append(item
    def pop(self, item):
        return self.container.pop(item)
    def size(self):
        return len(self.container)  # length of the container

    def __iter__(self):
        return iter(self.container)

【问题讨论】:

  • 您需要定义 myStack.__iter__ 以使您的堆栈可迭代
  • list.pop 接受一个可选的索引来弹出。该索引必须是整数。您正在尝试通过引用弹出项目。我怀疑您的 sym 是整数的可迭代对象。
  • @PatrickHaugh 我用一串符号调用了该函数。符号不是整数。 spc('}{))[]({{}[][][]})})')

标签: python python-3.x stack string-matching


【解决方案1】:

这些行

if i not in stk1:

for j in stk1:

要求myStack可迭代。在 Python 中,这意味着它应该有一个 __iter__ 方法,该方法在其对象上返回一个 iterator。由于您已经有一个内部容器,__iter__ 方法可以很简单:

class myStack:
    ...
    def __iter__(self):
        return iter(self.container)

【讨论】:

  • 感谢@Serge,但我现在遇到另一个类型错误; stk1.pop(j) 和 stkall.pop(k) TypeError: pop() 接受 1 个位置参数,但给出了 2 个,但我确实将一个参数传递给 pop() ... i 在一个点,j 在另一个点跨度>
  • @EwuramaMinkaAkuoko “一个参数”是堆栈的实例,self。它应该被称为stack.pop()。纯堆栈实现应该只能推送、弹出和查看“顶部”元素
  • @PatrickHaugh 我在我创建的堆栈对象(stk1 和 stkall)上调用了 pop。请准确解释你的意思,它应该被称为 stack.pop() 。可以做个示范吗?
  • @EwuramaMinkaAkuoko:您声明了 2 个用于推送的参数(自身和项目)并且只传递项目(这是正确的)。对于pop,你声明了一个参数,所以你应该不传递:if j==k: stk1.pop() and stkall.pop()
  • @SergeBallesta 这行得通!谢谢。我修好了它。但是在这里我收到一个新错误“return self.container.pop(item) # pop from the container,这是从旧版本中修复的错误类型错误:'str'对象不能被解释为整数”你能帮忙吗调试?
【解决方案2】:

要使用堆栈进行括号验证,我们只需要一个堆栈。当我们遇到左括号时,我们将它们推入堆栈。当我们遇到右括号时,我们将顶部的左括号从堆栈中弹出,并比较两者。如果它们是相同的括号类型,我们继续,否则字符串无效。如果我们尝试弹出一个空堆栈,则该字符串无效。如果我们到达字符串的末尾而不清除堆栈,则字符串无效。

opening = '[{<('
closing = ']}>)'

d = dict(zip(opening, closing))

def validate(s):
    stack = []
    for c in s:
        if c in opening:
            stack.append(c)
        elif c in closing:
            if not stack:
                # tried to pop empty stack
                return False
            popped = stack.pop()
            if d[popped] != c:
                # bracket mismatch
                return False
    return not stack

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 2013-01-24
    • 2019-08-26
    相关资源
    最近更新 更多