我的任务是在python中提出一个回文程序。我在这做了什么
def isPalindrome(word):
for i in range(len(word)//2):
if word[i] != word[-1-i]:
return False
return True
print (isPalindrome("maam")) #returns TRUE
print (isPalindrome("madam")) #returns TRUE
print (isPalindrome("hello")) #returns FALSE
print (isPalindrome("macdam")) #returns FALSE
print (isPalindrome("buffalolaffub")) #returns TRUE
print (isPalindrome("argentina")) #returns FALSE
现在我的教练希望使用Stack
转换它。任何人都可以帮忙吗?
这是我拥有的Stack
数据结构:
class Stack:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def peek(self):
return self.items[len(self.items)-1]
def size(self):
return len(self.items)
答案 0 :(得分:2)
假设:
tests=["maam", "madam","hello","macdam","buffalolaffub","argentina"]
对于作为回文的字符串的惯用Python检查将是这样的:
word==word[::-1] # True or False
所以你可以打印一份这样的回文:
print [word for word in tests if word==word[::-1]]
要使用堆栈执行此操作,您需要将字符串转换为列表,然后可以使用Python列表/堆栈操作。这是一个小型演示:
def stack_cmp(s1,s2):
l1=list(s1)
l2=list(s2)
if len(l1)!=len(l2): return False
while True:
try:
if l1.pop()!=l2.pop(): return False
except IndexError:
return True
print [word for word in tests if stack_cmp(word, word[::-1])]
stack_cmp
的替代版本,不使用例外:
def stack_cmp(s1,s2):
l1=list(s1)
l2=list(s2)
while l1 and l2:
if l1.pop()!=l2.pop(): return False
if l1 or l2: return False
return True
然后使用这个wway:
>>> stack_cmp('mmmm','mmmm')
True
>>> stack_cmp('mmmm','mmmmm')
False
您的老师可能会反对使用切片来反转列表;即,revered_list=orig_list[::-1]
。如果是这种情况,您可以使用:
reversed_list=[]
orig_list_copy=orig_list[:]
while orig_list_copy:
reversed_list.append(orig_list_copy.pop()) # this reverses the list
这是一个带有palidrome检查器的Stack类:
class Stack(object):
def __init__(self,items):
self.items=[]
for e in items:
self.push(e)
def push(self,item):
self.items.append(item)
def pop(self):
return self.items.pop()
def __repr__(self):
return str(self.items)
def isPalindrome(self):
tr=Stack([])
t=Stack(self.items)
while t.items:
tr.push(t.pop())
t=Stack(self.items)
while t.items and tr.items:
c1=t.pop()
c2=tr.pop()
print c1,c2
if c1!=c2: return False
return True
答案 1 :(得分:0)
好吧,因为筹码是First In Last Out,他们自然会扭转局面。你可以迭代字符串,推动前半部分然后弹出并比较后半部分。