使用堆栈检查python中的回文

时间:2017-09-13 17:00:24

标签: python python-3.x stack palindrome

我想检查一个单词是否是回文。这是我写的要检查的python代码。但它并没有给我正确的结果。

Stack Class

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 个答案:

答案 0 :(得分:1)

问题末尾的输出很清楚为什么会发生这种情况。 a包含字符串kayak,而list1包含单个字母:k。这是因为每次调用list1 = s.pop()行时list1都会将list1重新分配给一个字母。您需要附加到list1而不是覆盖它。正如Phydeaux所说,正确的方法是在循环之前将list1 = ""定义为空字符串,如下所示:list1 += s.pop()。然后在循环中,像这样追加它:s.push(i)

但是,还有另一个问题,即在同一个循环中使用list1 += s.pop()s.push()将按顺序复制字符串,而不是按相反顺序复制。这是因为您正在向堆栈添加单个项目,并在每次循环迭代时立即清空它。你应该做的是在一个循环中调用list1 += s.pop(),然后在第二个循环中调用for i in a: s.push(i) list1 = "" while not s.isEmpty(): list1 += s.pop() 来获得反向字符串。

试试这个:

return a == a[::-1]

作为旁注:python在一行的末尾不需要分号。我意识到你可能会经历数据结构的教程,但检查回文的pythonic方法是with CTE as( SELECT project_id, MAX(update_date) update_date FROM YourTable GROUP BY project_id ) SELECT cte.project_id, cte.update_date , max(t.update_text) update_text FROM YourTable T inner join CTE on T.project_id = CTE.project_id group by cte.project_id, cte.update_date ;