0

私の課題は、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

今、私のインストラクターは、これをStacks を使用して変換することを望んでいます。誰でもこれを手伝ってもらえますか?

私が持っている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)
4

2 に答える 2

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  

次に、この方法で機能します。

>>> 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    
于 2013-02-08T00:05:08.343 に答える
0

スタックは先入れ後出しであるため、当然逆になります。文字列を反復処理して、前半をプッシュし、後半をポップして比較することができます。

于 2013-02-07T22:36:27.863 に答える