http://blog.csdn.net/zw_1510/article/details/51927554
问题1:用两个栈实现一个队列,实现队列的push和delete操作
栈的特性是先进后出(FILO),队列的特性是先进先出(FIFO),在实现delete时,我们的难点是如何将栈中最底层的数据拿出来,我们有两个栈,所以我们可以将一个栈中的数据依次拿出来压入到另一个为空的栈,另一个栈中数据的顺序恰好是先压入栈1的元素此时在栈2的上面,为了实现效率的提升,我们在delete时,判断栈2是否有数据,如果有的话,直接删除栈顶元素,在栈2为空时才将栈1的数据压入到栈2中,从而提高程序的运行效率,实现过程可以分为下面几个步骤:
1、push操作时,一直将数据压入到栈2中
2、delete操作时,首先判断栈2是否为空,不为空的情况直接删除栈2栈顶元素,为空的话将栈1的数据压入到栈2中,再将栈2栈顶元素删除。
实现代码如下:
template <typename T>
class CQueue
{
public:CQueue(void){}~CQueue(void){}void appendTail(const T& node);T deleteHead();
private:stack<T> stack1;stack<T> stack2;
};template<class T>
void CQueue<T>::appendTail(const T& node)//在队列尾部添加数据
{stack1.push(node);
}
template<class T>
T CQueue<T>::deleteHead()
{T tmp = 0;if (stack2.empty()) //若栈2为空{while (!stack1.empty()){tmp = stack1.top();stack2.push(tmp);stack1.pop();}}tmp = stack2.top();stack2.pop();return tmp;
}
- 运行结果如下:
问题2:用两个队列实现一个栈
因为队列是先进先出,所以要拿到队列中最后压入的数据,只能每次将队列中数据pop到只剩一个,此时这个数据为最后压入队列的数据,在每次pop时,将数据压入到另一个队列中。每次执行delete操作时,循环往复。(感觉效率低)每次删除时间复杂度O(N)
代码如下:
template <typename T>
class CStack
{
public:CStack(void){}~CStack(void){}void appendTail(const T& node);T deleteHead();
private:queue<T> q1;queue<T> q2;
};template<class T>
void CStack<T>::appendTail(const T& node)//在栈尾部添加数据
{if (!q1.empty())//不为空的执行push操作{q1.push(node);}else{q2.push(node);}
}
template<class T>
T CStack<T>::deleteHead()
{int ret = 0;if (q1.empty()){int i = q2.size();while (i > 1 )//将q2队列中的数据pop到只剩一个{q1.push(q2.front());q2.pop();--i;}ret = q2.front();q2.pop();}else{int i = q1.size();while (i > 1){q2.push(q1.front());q1.pop();--i;}ret = q1.front();q1.pop();}return ret;
两个问题解决思路类似,主要就是要合理使用队列和栈的特点,并注意程序的效率。