"""
File: array_stack.py
Created Time: 2022-11-29
Author: Peng Chen (pengchzn@gmail.com)
"""


class ArrayStack:
    """基于数组实现的栈"""

    def __init__(self) -> None:
        """构造方法"""
        self.__stack: list[int] = []

    def size(self) -> int:
        """获取栈的长度"""
        return len(self.__stack)

    def is_empty(self) -> bool:
        """判断栈是否为空"""
        return self.__stack == []

    def push(self, item: int) -> None:
        """入栈"""
        self.__stack.append(item)

    def pop(self) -> int:
        """出栈"""
        if self.is_empty():
            raise IndexError("栈为空")
        return self.__stack.pop()

    def peek(self) -> int:
        """访问栈顶元素"""
        if self.is_empty():
            raise IndexError("栈为空")
        return self.__stack[-1]

    def to_list(self) -> list[int]:
        """返回列表用于打印"""
        return self.__stack


"""Driver Code"""
if __name__ == "__main__":
    # 初始化栈
    stack = ArrayStack()

    # 元素入栈
    stack.push(1)
    stack.push(3)
    stack.push(2)
    stack.push(5)
    stack.push(4)
    print("栈 stack =", stack.to_list())

    # 访问栈顶元素
    peek: int = stack.peek()
    print("栈顶元素 peek =", peek)

    # 元素出栈
    pop: int = stack.pop()
    print("出栈元素 pop =", pop)
    print("出栈后 stack =", stack.to_list())

    # 获取栈的长度
    size: int = stack.size()
    print("栈的长度 size =", size)

    # 判断是否为空
    is_empty: bool = stack.is_empty()
    print("栈是否为空 =", is_empty)
