2012-08-24 3 views
1

파이썬에서 제네릭 스택을 만드는 방법은 무엇입니까? 내 스택 파이썬에서 구현 : 클래스 노드의파이썬, 일반 함수

class Node(object): 
    def __init__(self, d): 
     self.data = d 
     self.nextNode = None 

class Stack(object): 
    def __init__(self): 
     self.top = None 

    def push(self, item): 
     newNode = Node(item) 
     newNode.nextNode = self.top 
     self.top = newNode 

    def pop(self): 
     if self.top == None: 
      return None 
     item = self.top.data 
     self.top = self.top.nextNode 
     return item 

지금은 걸었습니다 개체하지만 어떻게 내가 거기에 아무것도 넣을 수 있도록 일반적인 스택을 구현합니다.

class StackWithMin(qs.Stack): 
    def push(self, val): 
     if self.peek() != None: 
      minval = min(self.peek().value, val) 
     else: 
      minval = val 
     qs.Stack.push(NodeWithMinV2(val, minval)) 
: 나는, 노드

class NodeWithMin: 
    def __init__(self, value, minval): 
     self.data = value 
     self.minval = minval 

의 새로운 유형을 생성하고 노드의 이러한 유형에 따라 스택을 만들 수 있어야합니다 그래서 예를 들어,이 같은 (물론이 작동하지 않습니다)를해야한다

어떤 아이디어가 있습니까?

편집 : 나는 다음 오류 때문에 작동하지 않았다

unbound method push() must be called with Stack instance as first argument (got NodeWithMinV2 instance instead) 

내가 self

+0

그것이 작동하지 않는다는 것이 무엇을 의미합니까? 당신이 제대로하고있는 것처럼 보입니다. – Joe

+1

왜 파이썬'목록'을 사용하는 대신 자신의 스택을 굴리기를 원하십니까? 'list.append (element)'를 누르면 푸시되고,'element = list.pop()'가 팝업됩니다. –

+0

아마도 @capoluca는 잘 알려진 데이터 구조를 통해 파이썬에서 제네릭 (또는 동급)을 수행하는 방법을 배우려고 노력하고 있을까요? – Joe

답변

2

당신은 그냥 목록을 사용할 수 있습니다 놓친,하지만 나는 완전히 당신이 뭔가 더 나은 추상화 할 수있는 방법을 이해합니다.

콜렉션 모듈에서 큐를 사용할 수도 있습니다. 그것은 양쪽 끝에 추가하거나 제거 할 수 있으며 목록보다 더 추상적입니다.

당신이 돋보이는 모습. 최소한의 것을 넣고 싶다면, 그냥 새로운 클래스를 만들고, 그것의 인스턴스를 항목 인자로 push 메소드에 전달하면됩니다.

나는 여기서 추측하고 있지만 우선 순위 대기열은 푸시 연대기에 의한 주어진 끝에서 가장 가치가 적은 노드를 팝하는 것이고, heapq 모듈을 체크 아웃 할 수 있습니다 . 엄청나게 추상적으로도 추상화되지는 않지만 작동하며 빠르며 더 잘 추상화하는 것을 막을 수있는 방법은 없습니다.