剑指offer-面试题7:用两个栈实现队列

题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appenTail和deleteHead,分别完成在队列尾部插入结点和队列头部删除结点的功能。

解法:因为栈是后入先出,而队列是先入先出。即出栈的顺序是和入栈的顺序颠倒的,由负负得正很容易想到两个栈可以实现按原先的顺序输出。

算法设计:(1)入队的时候总是插入stack1的尾部;

                  (2)出队的时候,如果stack2不为空,直接出栈,因为stack2中若有元素,它的栈顶元素是最先进入队列的元素,直接弹出;如果stack2为空,stack1的所有元素出栈,插入stack2,直到stack1为空。先进入的元素压在stack1的底端,从stack1出栈就出现在stack2的顶端了。

#include <iostream>
#include <stack>
using namespace std;

template <typename T> class CQueue
{
public:
//	CQueue(void);
//	~CQueue(void);
	
	void appendTail(const T& node);
	T deleteHead();
	void printQueue();
	int size();
	
private:
	stack<T> stack1;
	stack<T> stack2;
	int len;
};

template<typename T> void CQueue<T>::appendTail(const T& element)
{
	stack1.push(element);
	len++;
}

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)
		cout << "queue is empty" << endl;
		
	T head = stack2.top();
	stack2.pop();
	
	return head;
}

template<typename T> int CQueue<T>::size()
{
	return len;
}

template<typename T> void CQueue<T>::printQueue()
{
	for(int i = 0; i < size(); ++i)
		cout << deleteHead() << " ";
	cout << endl;
}
	

int main() {
	// your code goes here
	CQueue<int> Q;
	for(int i=1; i<10; ++i)
		Q.appendTail(i);
	Q.printQueue();
	return 0;
}
引申:用两个队列实现一个栈

解法:如果输入a,b,c,d,e,出栈的时候先输出a,那么可以将b,c,d,e已到queue2中,这时候queue1中只剩下a,直接出队。再出栈的时候只要把c,d,e再移到queue1中就可以了,这时候queue2只剩下b,依次类推。保证两个队列总有一个为空,插入的时候选择非空的队列插入。

#include <iostream>
#include <queue>
using namespace std;

template <typename T> class MyStack
{
public:
	T pop();
	void push(const T& node);
	MyStack();
	bool empty();
	
private:
	queue<T> queue1;
	queue<T> queue2;
};

template <typename T> MyStack<T>::MyStack()
{
	while(!queue1.empty())
		queue1.pop();
	while(!queue2.empty())
		queue2.pop();
}

template <typename T> void MyStack<T>::push(const T& node)
{
	if(queue1.empty() && !queue2.empty())
		queue2.push(node);
	else
		queue1.push(node);
}

template <typename T> T MyStack<T>::pop()
{
	T tmp;
	if(!queue1.empty() && queue2.empty())
	{
		while(queue1.size() > 1)
		{
			queue2.push(queue1.front());
			queue1.pop();
		}
		tmp = queue1.front();
		queue1.pop();
	}
	else if(queue1.empty() && !queue2.empty())
	{
		while(queue2.size() > 1)
		{
			queue1.push(queue2.front());
			queue2.pop();
		}
		tmp = queue2.front();
		queue2.pop();
	}
	else 
		cout << "stack is wrong" << endl;
	return tmp;
}

template <typename T> bool MyStack<T>::empty()
{
	if(queue1.empty() && queue2.empty())
		return true;
	return false;
}

int main() {
	// your code goes here
	MyStack<int> s;
	for(int i = 1; i < 10; ++i)
		s.push(i);
	while(!s.empty())
		cout << s.pop() << " ";
	cout << endl;
		
	return 0;
}




你可能感兴趣的:(剑指offer-面试题7:用两个栈实现队列)