栈与队列相互转化

剑指Offer 题目7: 两个栈实现队列


Queue.h

#ifndef  QUEUE_H
#define  QUEUE_H
#include <stack>

template <class T> 
class CQueue
{
public:
	CQueue(void){};
	~CQueue(void){};

	void appendTail(const T &element);
	T deleteHead();

private:
	stack<T> stack1;
	stack<T> stack2;
};
#endif


Queue.c
#include<iostream>
using namespace std;
#include "Queue.h"

/*
template<class T>
CQueue<T>::CQueue()
{
}

template<class T>
CQueue<T>::~CQueue()
{

}
*/

template <class T>
void CQueue<T>::appendTail(const T &element)
{
	//入队时,直接压入stack1的栈顶
	stack1.push(element);
}
template <class T>
T CQueue<T>::deleteHead()
{
	/*
	  出队时,
	  若stack2为空,则将stack1的元素弹出并压入到stack2中.
	  若stack2不为空,则直接弹出stack2的栈顶元素.
	*/
	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;
}


main.c

/*
  使用两个栈实现队列的功能
*/
#include <iostream>
#include "Queue.cpp"

using namespace std;

int main(void)
{
	CQueue<char> q;
	//入队
	q.appendTail('a');
	q.appendTail('b');
	q.appendTail('c');
	//出队
	cout<<q.deleteHead()<<endl;

	return 0;
}



两队列实现栈:
/*
  使用两个队列实现栈的功能
*/
#include <iostream>
#include <queue>
using namespace std;

queue<char> queue1;
queue<char> queue2;

/*
  入栈,两个队列只存在两种情况.
  第一种: 两个队列都为空
  第二种: 一个为空,另一个不为空.
*/
void myPush(const char &c)
{
	//若两个队列都为空,则在queue1中入队
	if (queue1.size() == 0 && queue2.size() == 0)
	{
		queue1.push(c);
	}
	//若queue1不为空(即queue2为空),则queue1可直接入队
	else if (queue1.size() != 0)
	{
		queue1.push(c);
	}
	//若queue2不为空(即queue1为空),则queue2可直接入队
	else if (queue2.size() != 0)
	{
		queue2.push(c);
	}
}

//出栈
char myPop()
{
	if (queue1.size()==0 && queue2.size()==0)
	{
		throw new exception("stack is empty!");
	}
	else if (queue1.size() != 0)
	{
		//将queue1队尾元素除外的元素出队,并压入queue2中
		while (queue1.size() >1)
		{
			char s = queue1.front();
			queue1.pop();
			queue2.push(s);
		}
		//将队尾元素弹出
		char cs = queue1.front();
		queue1.pop();
		return cs;
	}
	else if (queue2.size() != 0)
	{
		//将queue2队尾元素除外的元素出队,并压入queue1中
		while (queue2.size() >1)
		{
			char s = queue2.front();
			queue2.pop();
			queue1.push(s);
		}
		//将队尾元素弹出
		char cs = queue2.front();
		queue2.pop();
		return cs;
	}
}

int main(void)
{
	

	//入栈
	myPush('a');
	myPush('b');
	myPush('c');

	//出栈
	cout << myPop() <<endl;
	cout << myPop() << endl;


	myPush('d');
	cout << myPop() << endl;

	return 0;
}



猜你喜欢

转载自blog.csdn.net/mayi_xiaochaun/article/details/49250473