我正在尝试创建一个程序,检查以确保文本在括号(so(),[],{}和not(),[,{})方面是平衡的。我可以在它平衡时使它工作,并且当它缺少一个结束括号(如前面的例子)时它不平衡。如果我在左边错过了一个括号((),],{}),那么我无法做到的就是失去平衡。我知道它试图从一个空堆栈弹出,但无法弄清楚如何反击行为。我的老师在她的Stack类中有它,如果它试图弹出到一个空堆栈,那么会自动引发一个异常,我无法改变她的类,这就是问题所在,否则我就会把它当作假的而不是在这个烂摊子里。那么在提出错误之前,有没有人想过如何做到这一点? 这是代码:
from ListNode import *
from Stack import Stack
ch = 0
s = 0
check = True
def parbalance():
stack = Stack()
user = input("Enter a file name: ")
file = open(user)
lines = file.readlines()
for char in lines:
for ch in char:
#print(ch)
if ch in "([{":
stack.push(ch)
if ch in ")]}":
popStack = stack.pop()
if ch == "(" and popStack != ")":
check = False
elif ch == "[" and popStack != "]":
check = False
elif ch == "{" and popStack != "}":
check = False
if stack.is_empty():
check = True
print("true")
else:
check = False
print("false")
parbalance()
如果有帮助,这是她的Stack类:
from ListNode import *
class Stack:
def __init__(self):
self.top = None
def push(self, item):
temp = ListNode(item)
temp.set_link(self.top)
self.top = temp
#self.top = ListNode(item, self.top)
def pop(self):
if self.top == None:
raise Exception("Trying to pop from an empty stack")
temp = self.top
self.top = temp.get_link()
return temp.get_item()
def destroy(self):
self.top = None
def is_full(self):
return False
def is_empty(self):
return self.top == None
答案 0 :(得分:1)
使用try
捕获错误:
try:
popStack = stack.pop()
except:
# Stack is empty, set failure and bail from the function.
check = False
return
另外,请注意您的测试是倒退的:
if ch == "(" and popStack != ")":
ch
是结束括号,popStack
是左括号,所以这应该是:
if ch == ")" and popStack != "(":
如果没有此更改,您的代码会将字符串"(}"
识别为平衡。
作为旁注,请考虑从函数返回True
或False
,而不是设置全局变量。使用全局变量从函数返回值不是一个好主意。
答案 1 :(得分:0)
您可以将代码放入try except
块。一旦捕获到异常,就会知道堆栈下溢。因此必须有一个不平衡的paranthesis。
顺便说一下:我不会使用冗长的if else
链。相反,我会按照以下几点来处理它:
pars = {'(':')', '[':']', '{':'}'}
....
try:
...
if ch in pars.keys():
stack.push(ch)
if ch in pars.values():
if ch != pars[stack.pop()]:
return False;
except:
return False;
return stack.is_empty()
这样,如果需要,您可以轻松添加其他括号符号。