使用Stacks的Python Palindrome程序

时间:2013-02-07 22:15:18

标签: python stack palindrome

我的任务是在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)

2 个答案:

答案 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,他们自然会扭转局面。你可以迭代字符串,推动前半部分然后弹出并比较后半部分。