《大话数据结构》配套源码:栈(Python版)

该书随书源码的语言为C;我参考书中内容和配套源码,写了一套Python格式的配套源码。这套配套源码并非直接翻译C语言的配套源码,而是结合我的理解略作了修改。 【Github项目地址】

作者:长行

时间:2020.07.12

Stack 栈的结构定义

class Stack:
    """栈的结构定义"""

    def __init__(self):
        """初始化一个空栈"""
        pass

    def __len__(self):
        """返回栈内元素数量"""
        pass

    def is_empty(self):
        """返回栈是否为空栈"""
        pass

    def clear(self):
        """清空栈"""
        pass

    def top(self):
        """若栈存在且非空,则返回栈顶元素"""
        pass

    def push(self, value):
        """若栈存在,则插入新元素value到栈中并成为栈顶元素"""
        pass

    def pop(self):
        """若栈存在,则删除栈顶元素并返回其值"""
        pass

ArrayStack 顺序存储结构的栈(Python列表存储)

from Stack.Stack import Stack


class ArrayStack(Stack):
    """顺序存储结构的栈(Python列表存储)"""

    def __init__(self):
        """初始化一个空栈"""
        super().__init__()
        self._data = []

    def __len__(self):
        """返回栈内元素数量"""
        return len(self._data)

    def is_empty(self):
        """返回栈是否为空栈"""
        return len(self._data) == 0

    def clear(self):
        """清空栈"""
        self._data.clear()

    def top(self):
        """若栈存在且非空,则返回栈顶元素"""
        if self.is_empty():
            raise ValueError("Stack is Empty")
        return self._data[-1]

    def push(self, value):
        """若栈存在,则插入新元素value到栈中并成为栈顶元素"""
        self._data.append(value)

    def pop(self):
        """若栈存在,则删除栈顶元素并返回其值"""
        if self.is_empty():
            raise ValueError("Stack is Empty")
        return self._data.pop()

LinkedStack 链式存储结构的栈(单链表存储)

SinglyLinkedNode(单链表结点)

from LinkedList.SinglyLinkedNode import SinglyLinkedNode
from Stack.Stack import Stack


class LinkedStack(Stack):
    """链式存储结构的栈(单链表存储)"""

    def __init__(self):
        super().__init__()
        self._head = None  # 头指针
        self._size = 0  # 栈中元素的数量

    def __len__(self):
        """返回栈中元素的数量"""
        return self._size

    def is_empty(self):
        """返回栈是否为空"""
        return self._size == 0

    def clear(self):
        """清空栈"""
        self._head = None
        self._size = 0

    def push(self, value):
        """向栈中压入元素"""
        self._head = SinglyLinkedNode(value, self._head)  # 构造链表对象
        self._size += 1

    def top(self):
        """查询栈顶元素"""
        if self.is_empty():
            raise ValueError("Stack is Empty")
        return self._head.value

    def pop(self):
        """取出栈顶元素"""
        if self.is_empty():
            raise ValueError("Stack is Empty")
        ans = self._head.value
        self._head = self._head.next
        self._size -= 1
        return ans

猜你喜欢

转载自blog.csdn.net/Changxing_J/article/details/107295597