1.用2个栈实现队列:第一个栈输入进数据,在delete数据时,将第一个栈的数据pop到第二个栈中,这样就能用栈构建队列了
2.用2个队列构建栈:当两个队列都为空时,将数据输入到第一个队列中,在delete时,将第一个队列中除了最后一个输入的数据之外的其他数据pop到另一个队列中,pop第一个队列这样就起到了后进先出的作用,继续删除时,将第二个队列中除了最后一个数之外 的数都pop到第一个中,删除第二个队列中最后一个,。。。。。不多说了,代码上来。
//2个栈实现队列的队尾插入和队头删除
#include <iostream>
#include <stack>
#include <assert.h>
using namespace std;
template<class T> class CQueue
{
public:
CQueue() {}
~CQueue() {}
void appendTail(const T& node); // append a element to tail
void deleteHead(); // remove a element from head
private:
stack <T> m_stack1;
stack <T> m_stack2;
};
template<typename T> void CQueue<T>::appendTail(const T& element)
{
m_stack1.push(element);
}
template<typename T> void CQueue<T>::deleteHead()
{
if(m_stack2.size() <= 0)
{
while(m_stack1.size() > 0)
{
T& data = m_stack1.top();
m_stack1.pop();
m_stack2.push(data);
}
}
assert(m_stack2.size() > 0);
m_stack2.pop();
}
int main()
{
CQueue<int> m_queue;
m_queue.appendTail(1);
m_queue.appendTail(2);
m_queue.appendTail(3);
m_queue.appendTail(4);
m_queue.appendTail(5);
m_queue.appendTail(6);
m_queue.deleteHead();
return 0;
}
//用2个队列实现栈
#include <iostream>
#include <queue>
using namespace std;
template <class T> class CStack
{
public:
CStack(){};
~CStack(){};
void inputnum(const T &node);
void deletenum();
private:
queue<int> m_queue1;
queue<int> m_queue2;
};
template <class T> void CStack<T>::inputnum(const T &node)
{
if (m_queue1.empty()&&m_queue2.empty())
{
m_queue1.push(node);
}
else
{
if (!m_queue1.empty())
{
m_queue1.push(node);
}
if (!m_queue2.empty())
{
m_queue2.push(node);
}
}
}
template <class T> void CStack<T>::deletenum()
{
if (m_queue2.empty())
{
while (m_queue1.size()>1)
{
T &data=m_queue1.front();
m_queue1.pop();
m_queue2.push(data);
}
if (m_queue1.size()==1)
{
m_queue1.pop();
}
}
else
{
if (m_queue1.empty())
{
while (m_queue2.size()>1)
{
T &data=m_queue2.front();
m_queue2.pop();
m_queue1.push(data);
}
if (m_queue2.size()==1)
{
m_queue2.pop();
}
}
}
}
int main()
{
CStack<int> m_stack;
m_stack.inputnum(1);
m_stack.inputnum(2);
m_stack.inputnum(3);
m_stack.inputnum(4);
m_stack.inputnum(5);
m_stack.deletenum();
m_stack.deletenum();
m_stack.inputnum(6);
m_stack.deletenum();
return 0;
}