两个队列实现一个栈
目的:肯定没有这方面的要求,主要是考察逻辑思维。
思路:
(1):回忆栈的特性:先入后出;队列的特性:先进先出。那么这道题就是要通过两个先进先出来实现先进后出。
(2):出栈的顺序就是出队列的倒序,当栈出第一个元素,其实是队列的最后一个元素
(3):让q1的n-1个元素存入q2,然后让q1.dequeue输出最后一个元素,此时q1变成了空队列,然后q1和q2互换,q2又变为空队列,q1则为n-1个元素,循环。
class Queue():
def __init__(self):
self.items = []
def enqueue(self, item):
self.items.insert(0,item)
def dequeue(self):
return self.items.pop()
def size(self):
return len(self.items)
q1 = Queue()
alist = [1, 2, 3, 4, 5]
for item in alist:
q1.enqueue(item)
print(q1.items)
q2 = Queue()
while q1.size() > 0:
# 将q1中的n-1个取出放到q2中
while q1.size() > 1:
item = q1.dequeue()
q2.enqueue(item)
print(q1.dequeue(), end = ' ')
q1, q2 = q2, q1
实现链表反转
思路:
(1):设置3指针,pre,cur和next_node
(2):实现局部反转,cur.next = pre
(3):然后对指针进行跟新,让3个指针向前移动一位
(4):特殊情况:当没有节点是要进行判断。当进行next_node更新时候也要进行判断,若cur = None 时 next_node = cur.next 则会报错。
class Node():
def __init__(self, item):
self.items = item # 存储当前节点数据
self.next = None # 下一个节点信息(地址) 刚开始没有next
# 链表
class Link():
def __init__(self):
self._head = None # 初始化一个空链表 head用于记录第一个节点的地址
def travel(self):
# _head在链表创建好之后一定是不可边得
cur = self._head
while cur:
print(cur.items)
cur = cur.next
def append(self, item):
node = Node(item)
# 特殊情况:链表为空则前面直接为0报错,在此判断
if self._head == None:
self._head = node
return
cur = self._head
pre = None # 第一个节点之前肯定为None
while cur:
pre = cur # 这样我们就可以取到none之前的节点了
cur = cur.next
# 当cur.next=None时候 不能直接赋给新加入的节点即不能循环结束后cur.next=node应该是前一个
pre.next = node
def reverse(self):
# 判断特殊情况,没有节点
if self._head == None:
return self._head
cur = self._head
pre = None
next_node = cur.next
while cur:
cur.next = pre # 局部反转,然后p,c,n分别更新
pre = cur
cur = next_node
if cur: # 若cur更新为null那么就不要在更新next_node否则报错
next_node = cur.next
self._head = pre
return self._head
link = Link()
link.append(1)
link.append(2)
link.append(3)
link.append(4)
link.append(5)
link.travel()
link.reverse()
link.travel()