2017-09-13 10 views
0

特定の単語がパリンドロームかどうかをチェックしたいと思います。これはチェックするために書いたPythonコードです。しかし、それは私に正しい結果を与えていない。スタックを使ってPythonのパリンドロームを確認する

スタッククラス

class Stack: 
def __init__(self): 
    self.items=[] 

def isEmpty(self): 
    return self.items==[] 

def push(self,data): 
    self.items.append(data) 

def size(self): 
    return len(Self.items) 

def show(self): 
    print (self.items) 

def peek(self): 
    return self.items[len(self.items)-1] 

def pop(self): 
    assert not self.isEmpty() 
    return self.items.pop() 

プログラム

a=input("Enter a word: ") 
s=Stack(); 

for i in a: 
    s.push(i); 

while s is None: 
    list1 = s.pop(); 

if(list1 == a): 
    print("The word is a palindrome"); 
else: 
    print("It's not a palindrome"); 
    print(a); 
    print(list1); 

私はこのエラーを取得しています。

RESTART: C:/Users/Dil/AppData/Local/Programs/Python/Python36-32/Tutorials/checkpalindrome.py 
Enter a word: kayak 
Traceback (most recent call last): 
    File "C:/Users/Dil/AppData/Local/Programs/Python/Python36-32/Tutorials/checkpalindrome.py", line 35, in <module> 
    if(list1 == a): 
NameError: name 'list1' is not defined 

しかし、私は次のように私のプログラムを変更した場合:

a= input("Enter a word: ") 

s=Stack(); 

for i in a: 
    s.push(i); 
    list1 = s.pop(); 

if(list1 == a): 
    print("The word is a palindrome"); 
else: 
    print("It's not a palindrome"); 
    print(a); 
    print(list1); 

次のようにそれは私の出力が得られます:

>>> 
RESTART: C:/Users/Dil/AppData/Local/Programs/Python/Python36-32/Tutorials/checkpalindrome.py 
Enter a word: kayak 
It's not a palindrome 
kayak 
k 
>>> 

答えて

1

をあなたの質問の最後に出力がそれを作りますなぜこれが起こっているかはかなり明確です。 aには文字列kayakが含まれ、list1には単一の文字:kが含まれています。これは、list1 = s.pop()行が呼び出されるたびにlist1を1文字に再割り当てするためです。上書きするのではなく、list1に追加する必要があります。 Phydeaux氏が指摘するように、これを行う適切な方法は、ループの前にlist1を空文字列として定義することです(list1 = "")。そしてループの中で、それに次のように追加してください:list1 += s.pop()

しかし、同じループにs.push(i)list1 += s.pop()があると、逆の順序ではなく、順番に文字列がコピーされるという別の問題があります。これは、スタックに1つのアイテムを追加し、すべてのループ反復ですぐにそれを空にするためです。何をすべきかは、s.push()への呼び出しを1つのループで行い、次にlist1 += s.pop()が2番目のループで呼び出して、逆の文字列を取得することです。

これを試してみてください:

for i in a: 
    s.push(i) 

list1 = "" 
while not s.isEmpty(): 
    list1 += s.pop() 

をサイドノートとして:Pythonは行の最後にセミコロンを必要としません。私はあなたがデータ構造のチュートリアルを行う可能性が高いことを認識していますが、回文をチェックするためのpythonic方法はreturn a == a[::-1]です。

+0

ありがとうございました!それは働いた!説明をありがとう! – dilk

関連する問題