反轉(zhuǎn)棧的數(shù)據(jù),我們很容易想到可以使用兩個(gè)棧來(lái)實(shí)現(xiàn)熬荆,一個(gè)棧將數(shù)據(jù)全部壓入后,再依次出棧并且依次入棧到另一個(gè)棧中绸狐,得到的就是一個(gè)反轉(zhuǎn)了的棧卤恳。
但是累盗,如果我們只是用一個(gè)棧如何取實(shí)現(xiàn)呢?
我們可以使用遞歸的方法來(lái)實(shí)現(xiàn)突琳,遞歸會(huì)多次調(diào)用自身方法若债,還會(huì)將每次的返回值存在內(nèi)存中,我們只要控制存儲(chǔ)結(jié)果的順序就可以實(shí)現(xiàn)拆融。
class Stack(object):
# 使用list來(lái)作為棧
stack = list()
def push(self, data):
# 使用list的append方法來(lái)替代棧的push方法
self.stack.append(data)
def pop(self):
# 使用list的pop方法來(lái)替代棧的pop方法
return self.stack.pop()
def is_empty(self):
# 判斷棧是否為空
return True if len(self.stack) == 0 else False
def show(self):
# 打印棧的數(shù)據(jù)
print(self.stack)
def get_and_remove_last_element(self):
"""
:return: 刪除棧底元素并且返回棧底元素
"""
# 棧頂元素出棧
result = self.pop()
if self.is_empty():
return result
else:
# 得到棧底元素
last = self.get_and_remove_last_element()
# 將此次出棧的元素重新入棧(非棧底元素)
self.push(result)
# 每次返回棧底元素
return last
def reverse(self):
"""
:return:
"""
if self.is_empty():
return
else:
# 獲取棧底元素
i = self.get_and_remove_last_element()
# 遞歸蠢琳,依次將內(nèi)存中的值入棧,此時(shí)順序已經(jīng)反轉(zhuǎn)
self.reverse()
self.push(i)
if __name__ == '__main__':
stack = Stack()
stack.push(1)
stack.push(2)
stack.push(3)
stack.show()
stack.reverse()
stack.show()