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;
};

牛客网 OJ
AcWing OJ

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, 
posted @ 2019-01-29 10:53  youngliu91  阅读(129)  评论(0编辑  收藏  举报