介绍

    栈的结构特点是“先进后出”,即最后一个被压入的元素会先弹出

    队的结构特点是“先进先出”,即第一个进入队的元素先出来

题目1:

    用两个栈实现队列,队列声明如下,实现函数appenTail和deleteHead

template<typename T>
class cQueue
{
public:
	cQueue(void);
	~cQueue(void);

	void appendTail();//在队尾插入
	void deleteHead();//删除头
private:
	stack<T>stack1;
	stack<T>stack2;
};

实现函数appenTail和deleteHead

基本思想:

    用先把数据都存储到stack1中,此时stack2为空,删除时,若stack2为空,把stack1中的数据一个一个出栈push进stack2中,在stack2进行pop,若stack2不为空,直接从stack2中pop数据

template<typename T>
void cQueue<T>::appendTail(const T &element)
{
	stack1.push(element);
}
template<typename T>
T cQueue<T>::deleteHead()
{
	if (stack2.empty())
	{
		while (!stack1.empty())
		{
			stack2.push(stack1.top());
			stack1.pop();
		}
	}
	if (stack2.empty())
		throw new exception("the queue is empty");
	
	T top = stack2.top();
	stack2.pop();
	
	return top;
}

测试:

  1. 往空的队列里插入、删除数据

  2. 往非空的队列里插入、删除数据

  3. 连续删除直到队列为空


举一反三

    用两个队实现栈

    分析:用q1和q2两个队列,先将数据放到q1中,若q1中有N和数据,pop时,先把N-1个数据放到q2中,q1中最后剩下的元素pop出即可。

template<typename T>
class my_stack
{
public:
	void push(const T &x);
	T Pop();
private:
	queue<T> q1;
	queue<T> q2;
};
template<typename T>
void my_stack<T>::push(const T &x)
{
	/*if ((q1.empty() && q2.empty())
		|| (!q1.empty() && q2.empty()))*/
	if (q2.empty())
	{
		q1.push(x);
	}
	if (q1.empty())
	{
		q2.push(x);
	}
}
template<typename T>
T my_stack<T>::Pop()
{
	if (!q1.empty())
	{
		while (q1.size() > 1)
		{
			q2.push(q1.front());
			q1.pop();
		}
		T pop = q1.front();
		q1.pop();
		return pop;
	}
	else
	{
		while (q2.size() > 1)
		{
			q1.push(q2.front());
			q2.pop();
		}
		T pop = q2.front();
		q2.pop();
		return pop;
	}
}


关于栈的面试题_剑指未完待续。。。