Если вы наберете sh букв из первой половины слова в стек, вы сможете сравнивать их с остальной частью слова буква за буквой, когда вытаскиваете их из стека. Если они все совпадают, у вас есть палиндром. Нет необходимости вручную переворачивать список (и это лишает смысла использование стека) или делать копии. Оба вредят эффективности. Хитрость заключается в различении слов с нечетными длинами от четных, потому что вам не нужно сравнивать среднюю букву в словах с нечетной длиной
Поскольку вы не предоставили реализацию стека, я просто буду использовать список, но вы должны увидеть, как это работает:
def pali(s):
stack = []
mid = len(s)//2
# push first half of the word onto stack
for c in s[:mid]:
stack.append(c)
# adjust mid for odd length words
if len(s) % 2:
mid+=1
# look at rest of the word while popping off the stack
for c in s[mid:]:
if stack.pop() != c:
return False
return True
print(pali("hello")) # False
print(pali("madamimadam")) # True