python数据结构学习日记【栈】

文章介绍了栈这一数据结构的概念,LIFO原则,以及如何用Python实现栈的基本操作,包括push、pop、top和is_empty。此外,文章还展示了使用Python类创建栈的示例,并给出了将十进制转换为二进制的栈应用例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


栈(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))
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值