如何使用Python封装实现Stack?

问题描述 投票:0回答:1

我在python中实现了Stack的数据结构,其中maxsize、top和arr是Stack类中的实例变量,maxsize和top变量是通过setter方法来改变的。就像在C++或Java中,当我们定义堆栈或队列时,我们有一些私有变量,我们不希望在类外直接访问这些变量,而且这些变量的值不应该改变。变量top和maxsize,我通过写下 获取者设置者 的类中。

如何在Python中实现同样的事情,即持有堆栈元素的实例变量arr不能在类外使用object改变。

有什么方法可以让 胳肢窝 还是需要在Python中使用其他本地数据类型来实现Stack?

Stack的实现。

class Stack:
    def __init__(self, maxsize):
        self.maxsize = maxsize
        self.top = -1
        self.arr = []

    @property
    def maxsize(self):
        return self.__maxsize

    @maxsize.setter
    def maxsize(self, maxsize):
        if maxsize < 1:
            maxsize = 1
        if not getattr(self, 'maxsize', None):
            self.__maxsize = maxsize

    @property
    def top(self):
        return self.__top

    @top.setter
    def top(self, top):
        if getattr(self, 'top', -1) < self.maxsize and top < self.maxsize and top >= -1:
            if abs(getattr(self, 'top', -1) - top) in (0, 1):
                self.__top = top

    def is_empty(self):
        return self.top == -1

    def is_full(self):
        return self.top == self.maxsize - 1

    def push(self, ele):
        if self.is_full():
            return
        self.top += 1
        self.arr.append(ele)
        return ele

    def pop(self):
        if self.is_empty():
            return
        ele = self.arr[self.top]
        del self.arr[self.top]
        self.top -= 1
        return ele

    def display(self):
        print(*self.arr, sep=', ')


s = Stack(10)

s.push(23)
s.push(45)
s.push(34)

print("before changing arr >>>>> ")
s.display()
s.arr = [3,3,3,3,3,3,3,3] # this line breaking the stack implementation
                          # either it should raise error or should not change the
                          # value of variable which holding stack elements
print("after changing arr >>>>> ")
s.display()

输出。

before changing arr >>>>> 
23, 45, 34
after changing arr >>>>> 
3, 3, 3, 3, 3, 3, 3, 3
python algorithm data-structures stack encapsulation
1个回答
1
投票

改变 self.arrself.__arr 类中的各个地方。你不需要创建一个setter或getter,因为你不想在类外暴露这个。

class Stack:
    def __init__(self, maxsize):
        self.maxsize = maxsize
        self.top = -1
        self.__arr = []

    @property
    def maxsize(self):
        return self.__maxsize

    @maxsize.setter
    def maxsize(self, maxsize):
        if maxsize < 1:
            maxsize = 1
        if not getattr(self, 'maxsize', None):
            self.__maxsize = maxsize

    @property
    def top(self):
        return self.__top

    @top.setter
    def top(self, top):
        if getattr(self, 'top', -1) < self.maxsize and top < self.maxsize and top >= -1:
            if abs(getattr(self, 'top', -1) - top) in (0, 1):
                self.__top = top

    def is_empty(self):
        return self.top == -1

    def is_full(self):
        return self.top == self.maxsize - 1

    def push(self, ele):
        if self.is_full():
            return
        self.top += 1
        self.__arr.append(ele)
        return ele

    def pop(self):
        if self.is_empty():
            return
        ele = self.__arr[self.top]
        del self.__arr[self.top]
        self.top -= 1
        return ele

    def display(self):
        print(*self.__arr, sep=', ')
© www.soinside.com 2019 - 2024. All rights reserved.