【问题标题】:Checking a palindrome in python using stack使用堆栈检查python中的回文
【发布时间】:2018-02-22 11:53:42
【问题描述】:

我想检查某个单词是否是回文。这是我写来检查的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
>>> 

【问题讨论】:

    标签: python python-3.x stack palindrome


    【解决方案1】:

    问题末尾的输出很清楚为什么会发生这种情况。 a 包含字符串 kayak,而 list1 包含单个字母:k。这是因为list1 = s.pop() 行在每次调用时都会将list1 重新分配给一个字母。您需要附加到 list1 而不是覆盖它。正如 Phydeaux 所指出的,正确的做法是在循环之前将 list1 定义为一个空字符串,如下所示: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()
    

    附带说明:python 不需要在行尾使用分号。我知道您可能正在阅读数据结构教程,但检查回文的 Pythonic 方法是 return a == a[::-1]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      • 2013-06-18
      • 2011-05-24
      • 2011-09-01
      • 1970-01-01
      • 2021-12-08
      相关资源
      最近更新 更多