09 两个栈实现队列
题目
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。
template <typename T> class CQueue
{
public:
CQueue(void);
~CQueue(void);
void appendTail(const T & node);
T deleteHead();
private:
stack<T> stack1;
stack<T> stack2;
};
C 语言题解
C++ 题解
对于插入操作,不妨假设都先插入到stack1,也就实现了入队操作。但是出队操作,则需要借助stack2的过渡:
当stack2中不为空时,在stack2中的栈顶元素是最先进入队列的元素,可以弹出。如果stack2为空时,我们把stack1中的元素逐个弹出并压入stack2。由于先进入队列的元素被压到stack1的底端,经过弹出和压入之后就处于stack2的顶端了,又可以直接弹出。下图展示了一个使用两个栈实现队列的实例:
template <typename T> void CQueue<T>::appendTail(const T & element)
{
stack1.push(element);
}
template <typename T> T CQueue<T>::deleteHead()
{
if (stack2.size() <= 0)
{
while (stack1.size() > 0)
{
T & data = stack1.top();
stack1.pop();
stack2.push(data);
}
}
if (stack2.size() == 0)
throw new exception("queue is empty");
T head = stack2.top();
stack2.pop();
return head;
}
注意:
C++ 中 stack的基本操作:
s.push(item); //将item压入栈顶
s.pop(); //删除栈顶的元素,但不会返回
s.top(); //返回栈顶的元素,但不会删除
s.size(); //返回栈中元素的个数
s.empty(); //检查栈是否为空,如果为空返回true,否则返回false
python 题解
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.stackA=[]
self.stackB=[]
def push(self, node):
# write code here
self.stackA.append(node)
def pop(self):
if self.stackB:
return self.stackB.pop()
elif not self.stackA:
return None
else:
while self.stackA:
self.stackB.append(self.stackA.pop())
return self.stackB.pop()
注意:
- python 类内部的函数或者成员变量在使用时要加上
self
。 - python中list的
pop
操作不仅从列表中删除这个值同时也会返回这个值,而C++stack中的pop
操作只是删除值不会返回值。 - list知否为空可以直接使用
if
语句来判断。
两个队列实现栈
class solution:
def __init__(self):
self.queueA=[]
self.queueB=[]
def push(self, node):
self.queueA.append(node)
def pop(self):
# 如果队列A为空则整个栈为空
if not self.queueA:
return None
# 将队列A中的元素从头到尾依次放大队列B中,直到队列A剩下一个元素,也是最后入队的元素,它应该先弹出
while len(self.queueA)!=1:
self.queueB.append(self.queueA.pop(0))
#交换是为了下一次的pop
self.queueA,self.queueB=self.queueB,self.queueA
return self.queueB.pop()
测试
if __name__=='__main__':
times=5
testList=list(range(times))
testStock=solution()
for i in range(times):
testStock.push(testList[i])
print(testList)
for i in range(times):
print(testStock.pop(),end=', ')
执行结果:
[0, 1, 2, 3, 4]
4, 3, 2, 1, 0,