题目1:用两个栈是实现队列的队尾插入节点,队首删除节点的功能。
思路:
队尾插入节点:将节点压入栈1即可;
队首删除节点:先判断栈2是否为空,若为空,则将栈1的节点依次弹出并压入栈2,然后弹出栈2的顶端节点即可;若不为空,则直接弹出栈2的顶端节点即可。
实现:
template<typename T>class CQueue
{
public:
CQueue(void);
~CQueue(void);
void appendTail(const T& element);
T deleteHead();
private:
stack<T> stack1;
stack<T> stack2;
};
template<typename T> CQueue<T>::CQueue()
{
}
template<typename T> CQueue<T>::~CQueue()
{
}
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())
{
T& temp = stack1.top();
stack2.push(temp);
stack1.pop();
}
}
if (stack2.empty())
{
throw std::exception("queue is empty.");
}
T head = stack2.top();
stack2.pop();
return head;
}
题目2:用两个队列实现栈的插入和删除功能。
思路:
插入功能:将节点直接插入队列1的队尾即可。
删除功能:判断队列1是否为空,若不为空,则将队列1中的节点依次出队列并插入队列2中,直到队列1只剩一个元素为止,然后将该元素返回;若为空则检查队列2是否为空, 若不为空,则将队列2中的节点依次出队列并插入队列1中,直到队列2只剩一个节点为止,然后将该元素返回。
实现:
template<typename T> class CStack
{
public:
CStack(void);
~CStack();
void appendTail(const T& element);
T deleteTop();
private:
queue<T> queue1;
queue<T> queue2;
};
template<typename T>CStack<T>::CStack(void)
{
}
template<typename T>CStack<T>::~CStack(void)
{
}
template<typename T>void CStack<T>::appendTail(const T& element)
{
queue1.push(element);
}
template<typename T>T CStack<T>::deleteTop()
{
T topValue;
if (!queue1.empty())
{
while (queue1.size() > 1)
{
queue2.push(queue1.front());
queue1.pop();
}
topValue = queue1.front();
queue1.pop();
}
else
{
if (queue2.empty())
{
throw exception("stack is empty.");
}
else
{
while (queue2.size() > 1)
{
queue1.push(queue2.front());
queue2.pop();
}
topValue = queue2.front();
queue2.pop();
}
}
return topValue;
}