数据结构-栈

一.定义:

栈是一种特殊的线性表,简称为LIFO线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行,遵循后进先出的原则。
在这里插入图片描述

二.特点

1)只允许在一端进行插入和删除的线性表。
2)栈的插入操作称为压栈(push),栈的取出操作称为出栈(pop)。
3)栈的存储结构分为顺序存储和链式存储,顺序存储称为顺序栈,链式存储称为链式栈。

三.时间复杂度

进栈(增加元素):栈顶指针+1,新插入元素赋值给栈顶空间

出栈(删除元素):将要删除的栈顶元素赋值给e,栈顶指针-1

时间复杂度均为O(1)。

链式存储结构:时间复杂度均为O(1)。

四.基本运算

在这里插入图片描述
栈有两种存储方式,即线性存储(顺序栈)和链表存储(链栈)。
python 代码

栈的顺序表实现

class SStack: 
    #创建空栈
    def __init__(self):
        self._elems = []
    #栈的元素总数
    def __len__(self):
        return(len(self._elems))
    #判断空栈
    def is_empty(self):
        return self._elems == []
    #获取栈顶元素
    def top(self):
        if self._elems == []:
            raise StackUnderflow("空栈异常:in SStack.top()")
        return self._elems[-1]
    #入栈
    def push(self,elem):
        self._elems.append(elem)
    #出栈
    def pop(self):
        if self._elems == []:
            raise StackUnderflow("空栈异常:in SStack.pop()")
        return self._elems.pop()
st1 = SStack()
st1.push(3)
st1.push(7)
st1.push(5)
len(st1)
while not st1.is_empty():
    print(st1.pop())

等同于使用下面的语句

from pythonds.basic import Stack

调用

s=Stack()

print(s.isEmpty())
s.push(4)#入栈
s.push('dog')
print(s.peek())#获取栈顶元素
s.push(True)
print(s.size())#stack的大小
print(s.isEmpty())# 判断是否为空
s.push(8.4)
print(s.pop())# 弹出(删除)一个元素
print(s.pop())
print(s.size())

True
dog
3
False
8.4
True
2

栈的链表实现

# 表头作为栈顶,表尾作为栈底
# 优点:解决了顺序表的缺点-->新增节点开销小,不需要连续锋内存
# 缺点:1、依赖解释器的存储管理   2、每个节点开销
class LNode: # 表节点
    def __init__(self, elem, _next=None):
        self.elem = elem
        self.next = _next


class LStack: #用LNode作为节点
    def __init__(self):
        self._top = None
    
    def is_empty(self):
        return self._top is None

    def push(self, elem):
        self._top = LNode(elem, self._top)

    def pop(self):
        if self._top is None:
            raise StackUnderflow("空栈异常:in LStack.pop()")
        p = self._top
        self._top = p.next
        return p.elem
    
    def top(self):
        if self._top is None:
            raise StackUnderflow("空栈异常:in LStack.top()")
        return self._top.elem

st2 = LStack()
st2.push(3)
st2.push(5)
st2.push(7)
while not st2.is_empty():
    print(st2.pop())

五. 应用

1.反转字符串

from pythonds.basic import Stack

'''
1.创建空栈
2.字符串中的元素入栈
3.出栈
'''
def revstring(mystr):
    s=Stack()
    for i in mystr:
        s.push(i)
    revstr=''
    while not s.isEmpty():
        revstr=revstr+s.pop()
    return revstr

参考资料:
数据结构与算法分析
https://runestone.academy/runestone/books/published/pythonds/BasicDS/ImplementingaStackinPython.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值