2017-03-01 27 views
2

所以我試圖檢查一個單詞是否是使用堆棧的迴文。我已經得到它的一個例外。如果我嘗試使用'level'這個詞,但是,如果我嘗試'levell',它會變成真實的。這是我的代碼:Palindrome with stacks

import Stack 

def check_palindrome(): 
    s = Stack.Stack() 
    word = input('Enter a word: ') 
    for x in word: 
     s.push(x) 

    palindrome = True 
    for x in range(len(word)): 
     if s.pop() == word[x]: 
      palindrome = True 
     else: 
      palindrome = False 

    if palindrome == True: 
     print(word, 'is a palindrome.') 
    else: 
     print(word, 'is not a palindrome.')   


check_palindrome() 

我似乎無法弄清楚它爲什麼說這是真的。也許我在錯誤地思考這個問題。我的思路是將每個字母添加到堆棧使用

for x in word: 
    s.push(x) 

然後彈出它,因爲FILO和比較最後的第一個。任何有識之士將不勝感激!

+0

取代if palindrome == True:因爲你,當你發現一個字母不匹配不破,你才真正看的最後一個字母。你的算法最終只關心第一個和最後一個字母是否相同。試着用'example'來看看。你的代碼中缺乏的是,當一個單詞不是迴文,它再也不能成爲迴文。 – njzk2

回答

2

當然,也有很多更好的方法來檢查一個詞是迴文,使用逆轉字符串,與自己進行比較,例如(有本網站解決此一噸的答案)。

這就是說,你的問題:

for x in range(len(word)): 
    if s.pop() == word[x]: 
     palindrome = True 
    else: 
     palindrome = False 

如果一個字母不匹配,應該break循環,否則,答案是由最後循環迭代唯一條件。我會寫:

for letter in word: 
    if s.pop() != letter: 
     palindrome = False 
     break  # one mismatch: bail out 
else: 
    palindrome = True # OK 

+0

啊,謝謝!這工作完美! – John

2

我不知道你是否有意使用Stack,爲什麼不檢查這個單詞是否等於它的反向,就像這樣?

def check_palindrome(word): 
    palindrome = word == word[::-1] # True if word is equal to its reverse 

    if palindrome == True: 
     print(word, 'is a palindrome.') 
    else: 
     print(word, 'is not a palindrome.') 
+0

這是故意的,我知道它會簡單很多,但它是一個要求。 – John

0

的問題是,你繼續比較你會發現一個不匹配,甚至後(for循環else只有實現了所有迭代執行,而不會遇到break),所以palindrome即使設定爲False,也可以重置爲True。總的來說,你實際上只是檢查你的單詞的第一個和最後一個字母是否相同。當您發現不匹配時,您可以通過break解決此問題。

也只是作爲一個樣式注意,你可以用if palindrome: