Python 中的堆栈数据结构参考问题
Stack DataStructure Reference Issue in Python
我正在尝试使用 findMin() 的附加方法构建堆栈 adt,该方法 return 是堆栈中的最小整数。我正在使用我在 python 中构建的 2 个堆栈来执行此操作(注意在此 class 之外,堆栈工作正常)。
from StackandQueueADT import Stack
class MinStack:
'This class has same functionality as a regular stack with 1 extra method that finds min of stack'
'it will use a min stack to keep track of min number'
def __init__(self):
self.myStack = Stack()
self.minStack=Stack()
def isEmpty(self)->bool:
if(self.myStack.isEmpty()):
return True
return False
def push(self,x)-> None:
if(self.isEmpty() or x <= self.minStack.peek()):
self.minStack.push(x)
self.myStack.push(x)
def pop(self)->int:
if(not self.minStack.isEmpty() and self.myStack.peek() == self.minStack.peek()):
print("what is happening with current stack Before?: " + str(self.myStack.peek()))
print("pop minstack: " + str(self.minStack.pop()))
print("what is happening with current stack After?: " + str(self.myStack.peek()))
return self.myStack.pop()
def peek(self)->int:
if(self.myStack.isEmpty()):
return -1
return self.myStack.peek()
def getMin(self)->int:
if(self.minStack.isEmpty()):
return -1
return self.minStack.peek()
我遇到的问题出在 pop() 方法中。不知何故,如果它进入 if 语句从 minstack 中删除元素,它也会从 myStack 中删除元素。也就是说,它会在调用“return self.myStack.pop()”之前从 myStack 中删除元素。
我使用以下示例对此进行了测试:
minStack = MinStack()
minStack.push(-2)
minStack.push(0)
minStack.push(-3)
print("pop: " + str(minStack.pop()))
在这个例子中,当我只从 minStack 中弹出 -3 时,它隐式地从 minStack 和 myStack 中弹出。请注意,单独测试每个堆栈工作正常,但以某种方式这样做时,看起来相同的引用被传递给两个堆栈。
如果需要,这是我的堆栈 class:
class Stack:
stack=[]
top = -1
def isEmpty(self):
if self.top==-1:
return True
return False
def push(self,data):
self.top = self.top+1
self.stack.insert(self.top,data)
def pop(self):
if self.isEmpty():
print("The stack is empty!,nothing to pop")
return None
value = self.stack[self.top]
self.stack.pop(self.top)
self.top = self.top-1
return value
def peek(self):
if self.isEmpty():
print("The stack is empty!")
return -1
return self.stack[self.top]
class Stack:
stack=[]
a = Stack()
b = Stack()
print("a's stack", a.stack) # a's stack []
a.stack.append(1)
print("b's stack", b.stack) # b's stack [1]
在python中,class下定义的变量是class级变量,在class的所有实例之间共享。在您的代码中 self.minStack
和 self.myStack 是不同的实例,但它们在 Stack
class.
中共享相同的 stack
变量
当您通过 self.stack/top
访问时,它将为该实例创建独立的引用,但 stack
引用仍然引用同一个列表对象。你可能想做
class Stack:
def __init__(self):
self.stack = []
self.top = -1
这是一个非常混乱且冗长的主题,因此我建议您阅读有关 class 变量的内容。
我正在尝试使用 findMin() 的附加方法构建堆栈 adt,该方法 return 是堆栈中的最小整数。我正在使用我在 python 中构建的 2 个堆栈来执行此操作(注意在此 class 之外,堆栈工作正常)。
from StackandQueueADT import Stack
class MinStack:
'This class has same functionality as a regular stack with 1 extra method that finds min of stack'
'it will use a min stack to keep track of min number'
def __init__(self):
self.myStack = Stack()
self.minStack=Stack()
def isEmpty(self)->bool:
if(self.myStack.isEmpty()):
return True
return False
def push(self,x)-> None:
if(self.isEmpty() or x <= self.minStack.peek()):
self.minStack.push(x)
self.myStack.push(x)
def pop(self)->int:
if(not self.minStack.isEmpty() and self.myStack.peek() == self.minStack.peek()):
print("what is happening with current stack Before?: " + str(self.myStack.peek()))
print("pop minstack: " + str(self.minStack.pop()))
print("what is happening with current stack After?: " + str(self.myStack.peek()))
return self.myStack.pop()
def peek(self)->int:
if(self.myStack.isEmpty()):
return -1
return self.myStack.peek()
def getMin(self)->int:
if(self.minStack.isEmpty()):
return -1
return self.minStack.peek()
我遇到的问题出在 pop() 方法中。不知何故,如果它进入 if 语句从 minstack 中删除元素,它也会从 myStack 中删除元素。也就是说,它会在调用“return self.myStack.pop()”之前从 myStack 中删除元素。
我使用以下示例对此进行了测试:
minStack = MinStack()
minStack.push(-2)
minStack.push(0)
minStack.push(-3)
print("pop: " + str(minStack.pop()))
在这个例子中,当我只从 minStack 中弹出 -3 时,它隐式地从 minStack 和 myStack 中弹出。请注意,单独测试每个堆栈工作正常,但以某种方式这样做时,看起来相同的引用被传递给两个堆栈。
如果需要,这是我的堆栈 class:
class Stack:
stack=[]
top = -1
def isEmpty(self):
if self.top==-1:
return True
return False
def push(self,data):
self.top = self.top+1
self.stack.insert(self.top,data)
def pop(self):
if self.isEmpty():
print("The stack is empty!,nothing to pop")
return None
value = self.stack[self.top]
self.stack.pop(self.top)
self.top = self.top-1
return value
def peek(self):
if self.isEmpty():
print("The stack is empty!")
return -1
return self.stack[self.top]
class Stack:
stack=[]
a = Stack()
b = Stack()
print("a's stack", a.stack) # a's stack []
a.stack.append(1)
print("b's stack", b.stack) # b's stack [1]
在python中,class下定义的变量是class级变量,在class的所有实例之间共享。在您的代码中 self.minStack
和 self.myStack 是不同的实例,但它们在 Stack
class.
stack
变量
当您通过 self.stack/top
访问时,它将为该实例创建独立的引用,但 stack
引用仍然引用同一个列表对象。你可能想做
class Stack:
def __init__(self):
self.stack = []
self.top = -1
这是一个非常混乱且冗长的主题,因此我建议您阅读有关 class 变量的内容。