栈(stack)
目测很多朋友已经在大一大二学习过数据结构这门课(盲猜同志们应该学的是严蔚敏的C语言版),用python来描述数据结构的逻辑结构也是类似。
一、概述
首先栈是只允许在一端进行插入或者删除操作的线性表,这些对象的插入或者删除操作遵循先进后出或者说后进先出的原则(LIFO:Last in First Out)。这个过程有点类似手枪弹匣的装弹,第一个放入的子弹到底部,依次装入后,最后一个装入的子弹在最顶部,射击时,最后一个装入的子弹最先被打出。栈的元素入栈也是如此,第一个入栈的元素到栈底(Bottom),最后一个入栈的元素在栈顶(Top)。过程如图所示:
栈的数学性质:若有n个不同元素进栈,那么出栈元素不同排列的个数为
1n+1(2nn)
\dfrac{1}{n+1}
\dbinom{2n}{n}
n+11(n2n)
上述公式也称为卡特兰数(Catalan)。此处证明可以参考《组合数学》。
二、栈的基操
S.push(e): 将一个元素e添加到栈顶
S.pop(e): 从栈中移除并返回栈顶的元素,若空栈,则 error
S.top():在不移除栈顶元素的前提下,返回一个栈S的栈顶元素,若栈为空,则error
S.is_empty():若栈内不包含任何元素,则返回一个布尔值True
len(S):返回元素的个数
使用python实现以上操作:
若已有一个列表(List)L,则:
栈操作 | python实现 |
---|---|
S.push(e) | L.append(e) |
S.pop() | L.pop() |
S.top() | L[-1] |
S.is_empty() | len(L)==0 |
len(S) | len(L) |
三、使用python创建一个栈及其基操
L = []#get一个空栈
def Stack_push(e):
L.append(e)
#添加元素操作
def Stack_top():
return L[-1]
#获得栈顶元素操作
def Stack_pop():
return L.pop()
#出栈操作
def Stack_isEmpty():
if len(L)==0:
return True
else:
return False
#检查是否为空栈
def Stack_len():
return len(L)
#获取栈的长度
def Stack():
if Stack_isEmpty()==True :
Stack_push('p')
Stack_push('y')
Stack_push('t')
Stack_push('h')
Stack_push('o')
Stack_push('n')
Stack_push('!')
else:
print('not empty')
#得到一个非空栈
print('栈长度为:',Stack_len())
#获得元素个数
print('栈的栈顶元素为:',Stack_top())
#获得栈顶元素
print('出栈元素为:',Stack_pop())
Stack()
为了使用方便,使用class 来创建stack操作
class Stack:
def __init__(self):
self.data=[]
def Stack_push(self,e):
self.data.append(e)
def Stack_pop(self):
return self.data.pop()
def Stack_top(self):
# (L[-1])
return self.data[-1]
def Stack_isEmpty(self):
if len(self.data) == 0:
return True
else:
return False
def Stack_len(self):
return len(self.data)
stack1=Stack()
stack1.Stack_push(7)
print(stack1.Stack_top())
四、应用
十进制转换为二进制
采用除以2取余数
此处沿用上述代码
class Stack:
def __init__(self):
self.data=[]
def Stack_push(self,e):
self.data.append(e)
def Stack_pop(self):
return self.data.pop()
def Stack_top(self):
# (L[-1])
return self.data[-1]
def Stack_isEmpty(self):
if len(self.data) == 0:
return True
else:
return False
def Stack_len(self):
return len(self.data)
stack1=Stack()
stack1.Stack_push(7)
#print(stack1.Stack_top())
def trans2(num):
tstack=Stack()
while num >0:
num1=num%2
tstack.Stack_push(num1)
num=num//2
str1=''
while tstack.Stack_isEmpty()==False:
str1=str1+str(tstack.Stack_pop())
return str1
print(trans2(24))