目录
【堆栈】
-
顺序栈
实现和操作。
注:和线性表的区别只在于数据输入和输出的位置是固定的。
import ctypes
#顺序栈
class Stack():
def __init__(self):
self._capacity = 10
self._top = 0
self._A = self._make_array(self._capacity)
def isEmpty(self):
return self._top == 0
def push(self,value):
if self._top == self._capacity:
self._resize(self._capacity*2)
self._A[self._top] = value
self._top += 1
def pop(self):
if self.isEmpty():
raise Exception("no value")
else:
# value = self._A[self._top]
self._top -= 1
# return value
def clear(self):
while self._top:
self.pop()
def _make_array(self, c):
return (c* ctypes.py_object)()
def _resize(self, c):
B = self._make_array(c)
for i in range(self._top):
B[i] = self._A[i]
self._A = B
self._capacity = c
def _print(self):
for i in range(self._top):
print self._A[i],' ',
print ''
测试:
mystack = Stack()
mystack.push(1)
mystack.push(2)
mystack.push(3)
mystack.push(4)
mystack.push(5)
mystack.push(1)
mystack.push(2)
mystack.push(3)
mystack.push(4)
mystack.push(5)
mystack.push(1)
mystack.push(2)
mystack.push(3)
mystack.push(4)
mystack.push(5)
mystack._print()
mystack.pop()
mystack._print()
mystack.pop()
mystack._print()
mystack.pop()
mystack._print()
mystack.clear()
mystack._print()
-
链栈
实现和操作。
#先定一个node的类
class Node(): #value + next
def __init__ (self, value = None, next = None):
self._value = value
self._next = next
def getValue(self):
return self._value
def getNext(self):
return self._next
def setValue(self,new_value):
self._value = new_value
def setNext(self,new_next):
self._next = new_next
#链栈
class LinkStack():
def __init__(self):
self._count = 0
self._top = None
def isEmpty(self):
return top == None
def push(self,value):
new_node = Node(value,self._top)
self._top = new_node
self._count += 1
def pop(self):
last = self._top
self._top = self._top.getNext()
self._count -= 1
last.next = None
def clear(self):
while self._top:
self.pop()
def _print(self):
current = self._top
while current:
print current.getValue(),'<-',
current = current.getNext()
print ''
测试:
my_linkstack = LinkStack()
my_linkstack.push(1)
my_linkstack.push(2)
my_linkstack.push(3)
my_linkstack.push(4)
my_linkstack.push(5)
my_linkstack._print()
my_linkstack.pop()
my_linkstack._print()
my_linkstack.pop()
my_linkstack._print()
my_linkstack.pop()
my_linkstack._print()
my_linkstack.clear()
my_linkstack._print()
-
相关题目
【逆波兰表达式求值】
根据逆波兰表示法,求表达式的值。
class Solution(object):
def evalRPN(self, tokens):
"""
:type tokens: List[str]
:rtype: int
"""
ret_list =[]
token = ['-','+','*','/']
for n in tokens:
if n in token:
second = ret_list.pop(-1)
first = ret_list.pop(-1)
if n == '-':
ret_list.append(first-second)
elif n=='+':
ret_list.append(first+second)
elif n=='*':
ret_list.append(first*second)
elif n=='/':
ret_list.append(int(first*1.0/second))
# if first*second<0 and first%second != 0:
# ret_list.append(first/second+1)
# else:
# ret_list.append(first/second)
else:
ret_list.append(int(n))
# print ret_list
return ret_list.pop(-1)
【队列】
-
顺序队列
实现和操作:
import ctypes
#顺序队列
class Queue():
def __init__(self):
self._capacity = 10
self._last = 0
self._A = self._make_array(self._capacity)
def isEmpty(self):
return self._last==0
def isFull(self):
return self._last == self._capacity
def enterqueue(self,value):
if self.isFull():
raise Exception("full")
else:
self._A[self._last] = value
self._last += 1
def delqueue(self):
if self.isEmpty():
raise Exception("empty")
else:
for i in range(self._last-1):
self._A[i] = self._A[i+1]
self._last -= 1
def clear(self):
while self._last:
self.delqueue()
def _make_array(self, c):
return (c* ctypes.py_object)()
def _print(self):
for i in range(self._last):
print self._A[i],' ',
print ''
测试:
myqueuq = Queue()
myqueuq.enterqueue(1)
myqueuq.enterqueue(2)
myqueuq.enterqueue(3)
myqueuq.enterqueue(4)
myqueuq.enterqueue(5)
myqueuq.enterqueue(6)
myqueuq.enterqueue(7)
myqueuq.enterqueue(8)
myqueuq.enterqueue(9)
myqueuq.enterqueue(10)
myqueuq._print()
myqueuq.delqueue()
myqueuq._print()
myqueuq.delqueue()
myqueuq._print()
myqueuq.delqueue()
myqueuq.delqueue()
myqueuq._print()
myqueuq.clear()
myqueuq._print()
-
循环队列
#循环队列
class CycleQueue():
def __init__(self):
self._capacity = 10
self._font = 0
self._rear = 0
self._A = self._make_array(self._capacity)
def isEmpty(self):
return self._rear==self._font
def isFull(self):
return (self._rear +1)%self._capacity==self._font
def enterqueue(self,value):
if self.isFull():
raise Exception("full")
else:
self._A[self._rear] = value
self._rear = (self._rear+1)%self._capacity
def delqueue(self):
if self.isEmpty():
raise Exception("empty")
else:
self._font = (self._font+1)%self._capacity
def clear(self):
while self._last:
self.delqueue()
def _make_array(self, c):
return (c* ctypes.py_object)()
def _print(self):
if self._font<self._rear:
print '<<<<<<<<'
for i in range(self._font,self._rear):
print self._A[i],' ',
elif self._font>self._rear:
print '>>>>>>>>>>>>'
for i in range(0,self._rear):
print self._A[i],' ',
print "zzz ",
for i in range(self._font,self._capacity):
print self._A[i],' ',
print ''
测试:
myqueuq = CycleQueue()
myqueuq.enterqueue(1)
myqueuq.enterqueue(2)
myqueuq.enterqueue(3)
myqueuq.enterqueue(4)
myqueuq.enterqueue(5)
myqueuq.enterqueue(6)
myqueuq.enterqueue(7)
myqueuq.enterqueue(8)
myqueuq.enterqueue(9)
myqueuq._print()
myqueuq.delqueue()
myqueuq._print()
myqueuq.enterqueue(100)
myqueuq._print()
myqueuq.delqueue()
myqueuq.delqueue()
myqueuq._print()
myqueuq.enterqueue(100)
myqueuq.enterqueue(100)
myqueuq._print()
-
链队列
#链式队列
class LinkQueue():
def __init__(self):
self._font = Node()
self._rear = Node(next=self._font)
def isEmpty(self):
return self._rear.getNext()==self._font
def enterqueue(self,value):
new_node = Node(value)
self._rear.getNext().setNext(new_node)
self._rear.setNext(new_node)
def delqueue(self):
if self.isEmpty():
raise Exception("empty")
else:
del_node = self._font.getNext()
self._font.setNext(del_node.getNext())
del_node.setNext(None)
def clear(self):
while not self.isEmpty():
self.delqueue()
def _print(self):
current = self._font.getNext()
while current:
print current.getValue(),'->',
current = current.getNext()
print ''
测试:
myqueuq = LinkQueue()
myqueuq.enterqueue(1)
myqueuq.enterqueue(2)
myqueuq.enterqueue(3)
myqueuq.enterqueue(4)
myqueuq.enterqueue(5)
myqueuq.enterqueue(6)
myqueuq.enterqueue(7)
myqueuq.enterqueue(8)
myqueuq.enterqueue(9)
myqueuq._print()
myqueuq.delqueue()
myqueuq._print()
myqueuq.enterqueue(100)
myqueuq._print()
myqueuq.delqueue()
myqueuq.delqueue()
myqueuq._print()
-
相关题目
【设计循环双端队列】设计实现双端队列
class MyCircularDeque(object):
def __init__(self, k):
"""
Initialize your data structure here. Set the size of the deque to be k.
:type k: int
"""
self._A = []
self._countmax = k
def insertFront(self, value):
"""
Adds an item at the front of Deque. Return true if the operation is successful.
:type value: int
:rtype: bool
"""
if self.isFull():
return False
else:
self._A.insert(0,value)
return True
def insertLast(self, value):
"""
Adds an item at the rear of Deque. Return true if the operation is successful.
:type value: int
:rtype: bool
"""
if self.isFull():
return False
else:
self._A.append(value)
return True
def deleteFront(self):
"""
Deletes an item from the front of Deque. Return true if the operation is successful.
:rtype: bool
"""
if self.isEmpty():
return False
else:
self._A.pop(0)
return True
def deleteLast(self):
"""
Deletes an item from the rear of Deque. Return true if the operation is successful.
:rtype: bool
"""
if self.isEmpty():
return False
else:
self._A.pop()
return True
def getFront(self):
"""
Get the front item from the deque.
:rtype: int
"""
if self.isEmpty():
return -1
else:
return self._A[0]
def getRear(self):
"""
Get the last item from the deque.
:rtype: int
"""
if self.isEmpty():
return -1
else:
return self._A[-1]
def isEmpty(self):
"""
Checks whether the circular deque is empty or not.
:rtype: bool
"""
return len(self._A) == 0
def isFull(self):
"""
Checks whether the circular deque is full or not.
:rtype: bool
"""
return len(self._A) == self._countmax
【递归】
【爬楼梯】
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注:重点在于迭代的条件以及迭代终止的输出。有时候因为迭代过深可能会出现问题,可以采用相应的矩阵或者一维数组存放计算结果。
class Solution(object):
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
fun = [1]*n
for nn in range(n):
if nn == 0:
fun[nn] = 1
elif nn == 1:
fun[nn] = 2
else:
fun[nn] = fun[nn-1]+fun[nn-2]
return fun[-1]