基于python实现常见数据结构
import numpy as np
class ResizingArrayStack():
a = np.empty(1)
N = 0
def isEmpty(self):
return self.N == 0
def size(self):
return self.N
def resize(self, max):
temp = np.empty(max)
for i in range(self.N):
temp[i] = self.a[i]
self.a = temp
def push(self, item):
if self.N == len(self.a):
self.resize(2 * len(a))
self.N = self.N + 1
self.a[self.N] = item
def pop(self):
self.N = self.N - 1
item = self.a[self.N]
self.a[self.N + 1] = None
if self.N > 0 and self.N == len(self.a) / 4:
self.resize(len(self.a / 2))
return item
def __next__(self):
return next(self.a)
def __iter__(self):
return self
class Stack():
def __init__(self):
self.first = None
self.N = 0
class Node:
def __init__(self):
self.item = None
self.next = None
def isEmpty(self):
return self.first is None
def size(self):
return self.N
def push(self, item):
oldfirst = self.first
self.first = self.Node()
self.first.item = item
self.first.next = oldfirst
self.N = self.N + 1
def pop(self):
item = self.first.item
self.first = self.first.next
self.N = self.N - 1
return item
class Queue():
def __init__(self):
self.first = None
self.last = None
self.N = 0
class Node:
def __init__(self):
self.item = None
self.next = None
def isEmpty(self):
return self.first is None
def size(self):
return self.N
def enqueue(self, item):
oldlast = self.last
self.last = self.Node()
self.last.item = item
self.last.next = None
if self.isEmpty():
self.first = self.last
else:
oldlast.next = self.last
self.N = self.N + 1
def dequeue(self):
item = self.first.item
self.first = self.first.next
if self.isEmpty():
self.last = None
self.N = self.N - 1
return item
class Bag():
def __init__(self):
self.first = None
self.N = 0
class Node:
def __init__(self):
self.item = None
self.next = None
def isEmpty(self):
return self.first is None
def size(self):
return self.N
def add(self, item):
oldfirst = self.first
self.first = self.Node()
self.first.item = item
self.first.next = oldfirst
self.N = self.N + 1
class MaxPQ():
def __init__(self,maxN):
self.pq=np.empty(maxN)
self.N=0
def isEmpty(self):
return self.N==0
def size(self):
return self.N
def insert(self,v):
self.N=self.N+1
self.pq[self.N]=v
self.swim(self.N)
def delMax(self):
max=self.pq[1]
self.pq[1], self.pq[self.N] = self.pq[self.N], self.pq[1]
self.N=self.N-1
self.pq[self.N+1]=None
return max
def swim(self,k):
while k>1 and self.pq[k/2]>self.pq[k]:
self.pq[k / 2], self.pq[k]=self.pq[k], self.pq[k / 2]
k=k/2
def sink(self,k):
while 2*k<=self.N:
j=2*k
if j<self.N and self.pq[j]>self.pq[j+1]:
j=j+1
if self.pq[k]<self.pq[j]:
break
self.pq[k], self.pq[j] = self.pq[j], self.pq[k]
k=j