利用两个栈模拟队列
stack1,stack2
首先向stack1当中放入数据,如果需要输出数据,从stack2中delete数据,如果stack2为空,就把stack1中数据导入stack2
<span style="font-size:14px;">#include "static.h"
#include <iostream>
#include <stack>
template<typename T>
class CQuue
{
public:
CQuue(){};
~CQuue(){};
void appendTail(const T &node);
T deleteHead();
private:
stack<T> m_stack1;
stack<T> m_stack2; //<存入数据的时候放入到stack1当中,取数据从stack2中取出,如果stack2为空,将stack1中数据转入stack2当中
};
template<typename T>
void CQuue<T>::appendTail(const T &node)
{
m_stack1.push(node);
}
template<typename T>
T CQuue<T>::deleteHead()
{
if (m_stack2.empty())
{
if (m_stack1.empty())
{
printf("There is no data in stack");
exit(1);
}
while(!m_stack1.empty())
{
m_stack2.push(m_stack1.top());
m_stack1.pop();
}
}
T valueTemp = m_stack2.top();
m_stack2.pop();
printf("%d ",valueTemp);
return valueTemp;
}
int main()
{
CQuue<int> cqueue;
cqueue.appendTail(1);
cqueue.appendTail(3);
cqueue.deleteHead();
cqueue.appendTail(5);
cqueue.appendTail(7);
cqueue.deleteHead();
cqueue.deleteHead();
cqueue.deleteHead();
return 0;
}</span>
两个队列模拟栈
这里用的方法和书中提到的方法不太一样,但是大致意思都是相同的,但是书中的方法会减少判断语句
两个队列,每次放入数据将数据放入一个空的队列当中,同时将另一个队列中的数据copy到当前这个队列当中,又保持一个空队列
输出数据的时候就从非空队列中输出
但是这样的方法每输入一个数据就需要copy一次,也比较麻烦
在书中,是每一次输出数据的时候需要将前面的数据copy到另一个queue当中
<span style="font-size:14px;">#include "static.h"
#include <iostream>
#include <queue>
template<typename T>
class CStack
{
public:
CStack(){};
~CStack(){};
void appendTail(const T& node);
T deleteHead();
private:
queue<T> m_queue1;
queue<T> m_queue2; //<存入数据的时候放入到m_queue1当中,然后再将数据都导入进queue2当中,然后每次添加数据放入一个空的queue当中
};
template<typename T>
void CStack<T>::appendTail(const T& node)
{
if (m_queue1.size()== 0)
{
m_queue1.push(node);
while (!m_queue2.empty())
{
m_queue1.push(m_queue2.front());
m_queue2.pop();
}
}
else
{
m_queue2.push(node);
while (!m_queue1.empty())
{
m_queue2.push(m_queue1.front());
m_queue1.pop();
}
}
}
template<typename T>
T CStack<T>::deleteHead()
{
T tempValue;
if (m_queue1.empty() && m_queue2.empty())
{
printf("the stack is empty");
exit(1);
}
if (m_queue1.size()>0)
{
tempValue = m_queue1.front();
m_queue1.pop();
}
else
{
tempValue = m_queue2.front();
m_queue2.pop();
}
printf("%d ",tempValue);
return tempValue;
}
int main()
{
CStack<int> cstack;
cstack.appendTail(1);
cstack.deleteHead();
cstack.appendTail(3);
cstack.appendTail(5);
cstack.appendTail(7);
cstack.deleteHead();
cstack.deleteHead();
cstack.deleteHead();
return 0;
}</span>