//栈 -> 后进先出
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;
};
//队列 -> 先进先出
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;
};