问题描述
用两个栈来实现一个队列
分析
这个题目其实是在考你对栈和队列的性质是否掌握的是否清晰明白。刚开始我大致想了几分钟没有想出来,后来去看了剑指offer上的指导,发现跟我想的是蛮接近。现在我再来捋一下思路,首先是实现队列,队列的性质是先进先出,而此时实现的条件是通过两个栈来实现。我们可以先考虑把元素存起来,也就是入队操作,因为你这个函数不可能什么也不做,最基础的一部肯定是要先存储起来。所以第一步操作就是将入队的元素存储在s1中,s1需要入栈来存储这些元素。如果此时需要出队呢?我们一定是要把s1中栈底的元素出队,而此时他却在栈底,通过将s1的出栈的元素在入进s2,那么s1的栈底元素也就变成了s2的栈顶元素,如果此时出队就是s2的出栈操作。这里有个限制操作就是,只要是入队就是s1的入栈操作,只有是出队就是s2的出栈操作。何时需要将s1的元素出栈到s2呢,也就是s2为空栈的时候,并且这个操作是伴随着出队操作时才会去判断的。也就是在入队中,只需对s1进行入栈操作即可。出队时,需要判断s2是否为空,如果为空,就将s1的内容出栈到s2。接着下来考虑一下入队和出队的溢出操作,入队的溢出是队满,队满的判断是s1满,s2不空。出队的操作是队不空,队列空的判断是s2空,s1也空。ps:感觉这次的分析应该是糟糕透了,说了太多废话。
Python实现1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78# coding:utf-8
class S:
def __init__(self):
self.m = 65536
self.top = -1
self.l = []
def isempty(self):
if(self.top == -1):
return True
return False
def isfull(self):
if(self.top == self.m):
return True
return False
def push(self, key):
if(not self.isfull()):
self.l.append(key)
self.top += 1
def pop(self):
if(not self.isempty()):
tmp = self.top
self.top -= 1
return self.l[tmp]
else:
return None
class Q:
def __init__(self):
self.s1 = S()
self.s2 = S()
def isempty(self):
if(self.s1.isempty() and self.s2.isempty()):
return True
return False
def isfull(self):
if(self.s1.isfull() and (not self.s2.isempty())):
return True
return False
def enqueue(self, key):
if(not self.isfull()):
self.s1.push(key)
else:
return None
def dequeue(self):
if(not self.isempty()):
if(self.s2.isempty()):
while(not self.s1.isempty()):
self.s2.push(self.s1.pop())
return self.s2.pop()
else:
return None
def test():
q = Q()
q.enqueue(1)
q.enqueue(2)
q.enqueue(3)
q.enqueue(4)
a = [1, 2, 3, 4]
f = 1
for i in a:
if(i != q.dequeue()):
f = 0
break
if(f == 1):
print("passed")
else:
print("failed")
test()