Palindrome与堆栈

时间:2017-03-01 20:17:48

标签: python

所以我试图检查一个单词是否是使用堆栈的回文。我有一个例外,它让它工作。如果我尝试“水平”这个词。但是,如果我尝试“levell'它回来了。这是我的代码:

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而将其弹出并将最后一个与第一个进行比较。任何见解都将不胜感激!

3 个答案:

答案 0 :(得分: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.')

答案 1 :(得分:2)

当然,还有更好的方法可以检查一个单词是一个回文,使用反向字符串并比较自身(在这个网站上有很多答案可以解决这个问题)。

那说,关于你的问题:

t=# do
$$
declare _r record;
begin
  for _r in (with j as (select * from (values ('3'),('{"valid":true}'),('notValid') ) as son) select column1 v from j) loop
    begin
      perform _r.v::json;
      exception when others then raise info '%',concat(_r.v,' ',SQLSTATE);
    end;
  end loop;
end;
$$
;
INFO:  notValid 22P02
DO
t=# \e
INFO:  test3 22P02
INFO:  notValid 22P02
DO

如果一个字母不匹配,则应该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 循环的else仅在未遇到for的情况下实现所有迭代时执行。

答案 2 :(得分:0)

问题是,即使您发现不匹配,您的比较仍会继续,因此即使将fmaf()设置为palindromeTrue也会重置为False。总的来说,你实际上只是检查你单词的第一个和最后一个字母是否相同。当您发现不匹配时,可以通过break解决此问题。

同样作为样式注释,您可以将if palindrome == True:替换为if palindrome: