两个栈模拟队列,两个队列模拟栈

来源:互联网 发布:雍正篡位还是继位 知乎 编辑:程序博客网 时间:2024/04/30 05:16
//栈 -> 后进先出

//队列 -> 先进先出


//1.两个栈 模拟实现一个队列


template<class T>
class MyQueue
{
public:


void Push(T t)  //插入不用判断,直接插入s1
{
s1.push(t);
}


T& Front()        //取队头数据
{
if (s2.size() != 0)  //如果s2 有数据,直接取
{
return s2.top();
}
else                 //s2没有数据,则把s1的数据全部插入s2(数据逆序),再取
{
while (!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
return s2.top();
}
}
void Pop()
{
if (s2.size() != 0)
{
s2.pop();
}
else
{
while (!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
s2.pop();
}
}


protected:
stack<T> s1;
stack<T> s2;
};


//2.两个队列模拟一个栈
template<class T>
class MyStack
{
public:
void Push(T t)     //数据直接插入q1
{
q1.push(t);
}


T Top()             //取栈顶数据 
{
assert(q1.empty() || q2.empty());


if (q1.size() == 1)
{
return q1.front();
}
if (q2.size() == 1)
{
return q2.front();
}


T tmp;
if (!q1.empty() && q2.empty())     //q2 为空,则把q1的数据插入到q2,吧q1最后一个数据返回
{
while (!q1.empty())
{
q2.push(q1.front());
q1.pop();
if (q1.size() == 1)
{
tmp = q1.front();
}
}
}
return tmp;


if (q1.empty() && !q2.empty())//q1 为空,则把q2的数据插入到q1,吧q2最后一个数据返回
{
while (!q2.empty())
{
q1.push(q2.front());
q2.pop();
if (q2.size() == 1)
{
tmp = q2.front();
}
}
}
return tmp;
}




void Pop()
{
if (!q1.empty() && q2.empty())     //q2 为空,则把q1的数据插入到q2,吧q1最后一个数据返回
{
while (!q1.empty())
{
q2.push(q1.front());
q1.pop();
if (q1.size() == 1)
{
q1.pop();
}
}
}
if (q1.empty() && !q2.empty())//q1 为空,则把q2的数据插入到q1,吧q2最后一个数据出栈
{
while (!q2.empty())
{
q1.push(q2.front());
q2.pop();
if (q2.size() == 1)
{
q2.pop();
}
}
}
}


protected:
queue<T> q1;
queue<T> q2;
};
原创粉丝点击