python实现链栈LinkedStack

概述

今天使用python实现一个链栈。链栈与链表的原理其实是一样的,只不过上链栈是受限的——仅能在栈顶进行插入和删除!所以链栈实现起来比链表更加容易!由于本人使用python的时间不多,难免会出现错误,如果你发现错误,希望大家给我指出!


接口设计

接口 功能
push 压栈
pop 弹栈
get_top 获取栈顶元素
is_empty 判断空栈

代码实现

  1. 定义一个LinkedStack类,在其内部再定义一个Node类并实现相关方法,给LinkedStack一个 __head属性用来表示链栈的头结点
class LinkedStack:
    class Node:
        def __init__(self, value=None, next_=None):
            self.__value = value
            self.__next: LinkedStack.Node = next_

        def set_value(self, value):
            self.__value = value
            return self

        def set_next(self, next_):
            self.__next: LinkedStack.Node = next_
            return self

        def get_value(self):
            return self.__value

        def get_next(self):
            return self.__next

    def __init__(self):
        self.__head: LinkedStack.Node = LinkedStack.Node()
  1. 实现push

    由于栈先进后出的特性,我们使用头插法
    def push(self, data):
        """
            压栈
        :param data: 需要添加的数据
        :return: 自身
        """
        node = LinkedStack.Node(data, self.__head.get_next())
        self.__head.set_next(node)
        return self
  1. 实现pop
    def pop(self):
        """
        弹栈
        :return: 弹出的元素
        """
        # 判断空栈 抛出空指针异常
        if not self.__head.get_next():
            raise Exception("NullPointerException")
        # 临时存一下要删除的结点
        temp_value = self.__head.get_next().get_value()
        self.__head.set_next(self.__head.get_next().get_next())
        # 返回弹栈的元素
        return temp_value
  1. 实现get_top
    def get_top(self):
        # 判断空栈 抛出空指针异常
        if not self.__head.get_next():
            raise Exception("NullPointerException")
        return self.__head.get_next().get_value()
  1. 实现is_empty
    def is_empty(self):
        return not bool(self.__head.get_next())

ok,这个类实现完毕!完整代码如下:

class LinkedStack:
    class Node:
        def __init__(self, value=None, next_=None):
            self.__value = value
            self.__next: LinkedStack.Node = next_

        def set_value(self, value):
            self.__value = value
            return self

        def set_next(self, next_):
            self.__next: LinkedStack.Node = next_
            return self

        def get_value(self):
            return self.__value

        def get_next(self):
            return self.__next

    def __init__(self):
        self.__head: LinkedStack.Node = LinkedStack.Node()

    def push(self, data):
        """
            压栈
        :param data: 需要添加的数据
        :return: 自身
        """
        node = LinkedStack.Node(data, self.__head.get_next())
        self.__head.set_next(node)
        return self

    def pop(self):
        """
        弹栈
        :return: 弹出的元素
        """
        # 判断空栈 抛出空指针异常
        if not self.__head.get_next():
            raise Exception("NullPointerException")
        # 临时存一下要删除的结点
        temp_value = self.__head.get_next().get_value()
        self.__head.set_next(self.__head.get_next().get_next())
        # 返回弹栈的元素
        return temp_value

    def get_top(self):
        if not self.__head.get_next():
            raise Exception("NullPointerException")
        return self.__head.get_next().get_value()

    def is_empty(self):
        return not bool(self.__head.get_next())

    def __del__(self):
        """
        析构函数 由于python是有gc的,所以该方法是可选的
        """
        while self.__head.get_next():
            temp = self.__head.get_next()
            self.__head.set_next(self.__head.get_next().get_next())
            del temp
        del self.__head

测试

1.括号平衡

def isBalance(string: str):
    stack = LinkedStack()
    i = 0
    while i < len(string):
        if string[i] == '{' or string[i] == '[' or string[i] == '(':
            stack.push(string[i])
        elif string[i] == ')':
            if not stack.is_empty() and stack.get_top() == '(':
                stack.pop()
            else:
                break
        elif string[i] == ']':
            if not stack.is_empty() and stack.get_top() == '[':
                stack.pop()
            else:
                break
        elif string[i] == '}':
            if not stack.is_empty() and stack.get_top() == '{':
                stack.pop()
            else:
                break
        i += 1
    return stack.is_empty() and i == len(string)

    if __name__ == '__main__':
        s = input("请输入一个字符串:")
        print(isBalance(s))

输出结果如下:
python实现链栈LinkedStack_第1张图片

你可能感兴趣的:(数据结构,python,数据结构,栈,算法,链表)