您可以在下面的链接中找到问题 https://www.codechef.com/problems/COMPILER 我想仅通过使用堆栈结构来解决此问题,而不能以任何其他简单的方式来解决。 我已经检查了所有可能的6个字符长度输入的输出,但是找不到任何错误的答案(我比较了正确解决方案的输出) 请找到算法会给出错误答案的任何组合。
class Stack:
def __init__(self):
self.items=[]
def isempty(self):
return self.items==[]
def push(self,item):
self.items.append(item)
def pop(self):
self.items.pop()
def peek(self):
return self.items[len(self.items)-1]
def size(self):
return len(self.items)
for j in range(int(input())):
arr=[x for x in input()]
s=Stack()
balanced=True
answer=0
fanswer=0
for h in range(len(arr)):
if arr[h]=="<":
s.push("<")
else:
if s.isempty():
break
else:
s.pop()
if not s.isempty():
balanced=False
answer=answer+1
else:
balanced=True
fanswer=fanswer+1
if h==(len(arr)-1) and s.isempty()!=True:
answer=0
if balanced==False: answer=0
print((answer+fanswer)*2)
编辑:我使用了两个变量来存储答案 考虑情况'<> <'和'<<> <'
答案 0 :(得分:0)
考虑表达式 << >> <<>
。
当您到达第二个>
字符时, answer
等于1,而 fanswer
等于1。表达式是平衡的直到第四个字符。
当您到达最后一个>
时,您会递增 answer
,但随后会遇到以下问题:
如果h ==(len(arr)-1)和s.isempty()!= True:
答案= 0
因此您将 answer
设置为0,因为您位于字符串的末尾并且堆栈也不为空。结果是(answer + fanswer)* 2
返回2,这是不正确的。正确答案是4。
只需跟踪表达式平衡的最后一个索引,就可以大大简化代码。总体思路如下。请注意,它并非完全是Python代码,但您应该能够轻松转换。
balancePos = -1
对于范围n(arr)
如果(arr [n] ==“ <”)
stack.push(“ <”)
其他
如果(stack.isEmpty())
打破;
stack.pop()
如果(stack.isEmpty())
balancePos = n
打印(balancePos + 1)
顺便说一句,我知道您说过您想使用堆栈来执行此操作,但实际上没有理由使用堆栈。您可以使用一个初始化为0的简单计数器来实现。将每个 stack.push
用一个计数器增量替换,并将每个 stack.pop
用一个减量替换。并且 if(stack.isEmpty())
变成 if(counter == 0)
。
这消除了堆栈溢出的可能性,并且速度也要快得多。