#棧的常用操作
# stack() 建立乙個空的棧物件
# push() 把乙個元素新增到棧的最頂層
# pop() 刪除棧最頂層的元素,並返回這個元素
# peek() 返回最頂層的元素,並不刪除它
# isempty() 判斷棧是否為空
# size() 返回棧中元素的個數
#使用python中的列表進行對棧的實現
class stack():
'''對棧進行模擬'''
def __init__(self):
self.values =
def push(self, value):
def pop(self):
return self.values.pop()
def peek(self):
if not self.isempty():
return self.values[len(self.values)-1]
def isempty(self):
return len(self.values) == 0
def size(self):
return len(self.values)
def print_all(self):
print(self.values)
s= stack()
print(s.isempty()) #true 代表棧為空
s.push(12)
s.push(13)
print(s.isempty()) #false
print(s.peek()) #13
print(s.size()) #2
print(s.pop()) #13
print(s.peek()) #12
s.push('hello')
s.push('this')
s.push('world')
s.print_all() #[12, 'hello', 'this', 'world']
print(s.size())
如果在一種資料結構的某個或某幾個部分具有與整體同樣的結構,稱為遞迴。
階乘遞迴函式實現:
if n == 0:
return 1
else:
return n * fact(n-1)
print(fact(3)) # 6
傳統方法實現遞迴:
result = 1
for i in range(1, n+1):
result *= i
return result
print(fact1(3)) # 6
其他例子:
if n == 1:
return 18
else:
re = age(n-1) + 2
print('遞迴返回的值:%d'%re)
print('遞迴的值:%d'%n)
return re
print(age(5)) # 26
# 遞迴返回的值:20
# 遞迴的值:2
# 遞迴返回的值:22
# 遞迴的值:3
# 遞迴返回的值:24
# 遞迴的值:4
# 遞迴返回的值:26
# 遞迴的值:5
# 26
例子2:
def recursion(n):
print(n)
if n/2 > 1:
re = recursion(n/2) # 此處沒有return語句, 但是遞迴進行回溯的時候,還是會進行該語句,進行列印操作
print('返回值', re)
print('上層遞迴值',n)
return n # 返回函式中的recursion進行遞迴,一步步返回溢位的 n值。棧結構。
print(recursion(10))
# 10
# 5.0
# 2.5
# 1.25
# 上層遞迴值 1.25
# 返回值 1.25
# 上層遞迴值 2.5
# 返回值 2.5
# 上層遞迴值 5.0
# 返回值 5.0
# 上層遞迴值 10
# 10
print('test recursion2 start ----')
def recursion2(n):
print(n)
if n/2 < 1:
re = recursion2(n/2)
print('返回值:',re)
else:
print('上層遞迴值:',n)
return n
recursion2(10)
print('test recursion2 end----')
# test recursion2 start ----
# 10
# 上層遞迴值: 10
# test recursion2 end----
使用遞迴函式解決揹包問題: 從 6個物品中選擇 若干個,使得總重量為weight
if weight == 0:
return true
if weight < 0 or (weight > 0 and n < 1): # weigh小於0了,則無解。weight還有重量,但是沒種類了,也還是無解
return false
if knap_rec(weight - wlist[n-1], wlist, n-1): #如果選擇最後一件物品都有解。則減少重量,也減少種類
print('item ' + str(n) + ':' + str(wlist[n-1]))
return true
if knap_rec(weight, wlist, n-1): #如果不選擇最後一件物品仍然有解。針對同樣重量當物品種類減1的子問題仍有解,則有解
return true
else:
return false
weight = 20
wlist = [2, 8, 10, 12, 15, 6]
n = 6
print(knap_rec(weight, wlist, n))
# item 1:2
# item 4:12
# item 6:6
# true
python資料結構與演算法 棧
逆波蘭表示式 reverse polish notation 有效的運算子包括 每個運算物件可以是整數,也可以是另乙個逆波蘭表示式。輸入 2 1 3 輸出 9 解釋 2 1 3 9 分析 棧 遍歷陣列,逐漸壓入棧中,如果遇到運算字元,則彈出棧頂兩個元素,之後將計算結果再壓入棧中 class solu...
python資料結構與演算法 棧
棧 stack 建立乙個新的空棧 push item 新增乙個新的元素item到棧頂 pop 彈出棧頂元素 peek 返回棧頂元素 is empty 判斷棧是否為空 size 返回棧的元素個數 stack 建立乙個新的空棧 push item 新增乙個新的元素item到棧頂 pop 彈出棧頂元素 p...
資料結構與演算法《棧》
概念 棧 stack 又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向乙個棧插入新元素又稱作進棧 入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素 從乙個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使...