Python使用list和单向链表实现栈

1. 代码实现

class ArrStack:
    """
    使用list实现栈,第一个元素为栈底,最后一个元素为栈顶
    """
    def __init__(self):
        """
        初始化为空list
        """
        self.items = []

    def stackin(self, value):
        """
        入栈
        :param value: 入栈的值
        :return: NULL
        """
        self.items.append(value)

    def stackpop(self):
        """
        出栈,删除栈顶的内容
        :return: 栈顶的值
        """
        return self.items.pop()

    def top(self):
        """
        获取栈顶的值
        :return: 栈顶的值
        """
        if self.items:
            return self.items[len(self.items)-1]
        return None

    def is_empty(self):
        """
        是否为空栈
        :return: bool值
        """
        if self.items:
            return False
        return True

    def size(self):
        """
        获取栈的大小
        :return: 栈的大小
        """
        return len(self.items)


class Node:
    """
    节点,用于实现栈
    """
    def __init__(self, val=None):
        self.data = val
        self.next = None


class LinkListStack:
    """
    单向链表实现栈,第一个节点为栈顶,最后一个节点为栈底
    """
    def __init__(self):
        self.head = Node()
        self.length = 0  # 定义一个长度属性方便size,is_empty等等

    def stackin(self, val):
        new_node = Node(val)
        tmp = self.head.next
        self.head.next = new_node
        new_node.next = tmp
        self.length += 1

    def stackpop(self):
        if not self.length:
            return None
        tmp = self.head.next
        self.head.next = self.head.next.next
        self.length -= 1
        pop_val = tmp.data
        del tmp
        return pop_val

    def top(self):
        if not self.length:
            return None
        return self.head.next.data

    def is_empty(self):
        if self.length:
            return False
        return True

    def size(self):
        return self.length


if __name__ == "__main__":
    arr_stack = ArrStack()
    ll_stack = LinkListStack()
    sample = [1, 2, 3, 4]

    print('arr_stack is empty?', arr_stack.is_empty())
    print('ll_stack is empty?', arr_stack.is_empty())

    for x in sample:
        arr_stack.stackin(x)
        print('input to stack', x, 'arr_stack is empty?', arr_stack.is_empty(), 'size:', arr_stack.size(), 'stack top:',
              arr_stack.stacktop())

    for _ in sample:
        print('pop:', arr_stack.stackpop(), 'arr_stack is empty?', arr_stack.is_empty(), 'size:', arr_stack.size(), 'stack top:', arr_stack.stacktop())

    print('**************************')
    print('*** test linkliststack ***')
    print('**************************')

    for x in sample:
        ll_stack.stackin(x)
        print('input to stack', x, 'll_stack is empty?', ll_stack.is_empty(), 'size:', ll_stack.size(), 'stack top:',
              ll_stack.stacktop())
    for _ in sample:
        print('pop:', ll_stack.stackpop(), 'll_stack is empty?', ll_stack.is_empty(), 'size:', ll_stack.size(), 'stack top:', ll_stack.stacktop())

2. 在线调试

可视化过程

3.打印结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值