队列的特点是先进先出,尾部插入,头部删除,时间复杂度是o(1)
栈的特点是先进后出,尾部插入,尾部删除,因为他的时间复杂度是o(1)。
1.两个栈实现一个队列
怎么对这两个栈进行操作,从而对外部体现出一个队列的存在?
插入删除的具体规则?

在上面的图中,我们用ST1来模拟栈1,用 ST2来模拟栈2。
插入规则:直接向ST1插入即可.
删除规则:观察ST2是否为空,不空则直接出一个值即可如果ST2为空,则将ST1里面的所有元素,依次倒腾到ST2中,这时ST2就不空了,直接出一个值即可如果ST2和ST1都为空,说明模拟出的队列是一个空队列,则不能出值.
1.当有1 2 3 三个值的时候,先执行插入功能。

2.当我们要输出一个值的时候输出的时候,现将st1里面的全部扔进st2里面,然后在输出一个值1,使得达到先进的先出,此时的队列是1。

3.在插入两个值4 5

4.删除两个值,因为st2有值,则删除的是 2 3,此时的队列是1 2 3

5.继续删除两个值,因为st2是空的,所以将st1的值转移到st2得到

6.删除两个值,删除st2里面的4 5得到的队列就是1 2 3 4 5,模拟了队列先进的先出。
typedef struct TwoStackToQueue
{
std::stack<int> st1;//ST1
std::stack<int> st2;//ST2
}TwoStackToQueue;
//入队
bool Push_TSTQ(TwoStackToQueue* tstq, int val)
{
assert(tstq != NULL);
//插入规则:无脑的向ST1入
tstq->st1.push(val);
return true;
}
//出队
bool Pop_TSTQ(TwoStackToQueue* tstq)
{
//assert
//1.如果两个栈同时为空,则直接返回假
if (tstq->st1.empty() && tstq->st2.empty())
{
return false;
}
//2.直接去从ST2中取值,如果ST2不空,直接去结束
if (!tstq->st2.empty())
{
tstq->st2.pop();
return true;
}
else
{
//3.直接去从ST2中取值,如果ST2空,则说明ST1肯定
// 不空,则将ST1中的所有元素倒腾到ST2中(倒腾:ST1出
// 一个值,ST2入一个值),这时ST2就不空,就可以取值了
while (!tstq->st1.empty())
{
tstq->st2.push(tstq->st1.top());
tstq->st1.pop();
}
tstq->st2.pop();
return true;
}
}
2.两个队列实现一个栈
插入规则:直接向Q1
插删除规则:首先确保Q1和Q2不能同时为空直接去观察是Q1空还是不空:如果Q1不空,则将Q1全部的数据留一个,剩余的全部倒腾到Q2,此时就可以将Q1剩下的这一个数据出掉如果Q1空,则Q2一定不空,则将Q2全部的数据一个,剩余的全部倒腾到01,此时就可以将Q2剩下的这一个数据出掉

这里的Q1代表的是队列1,Q2代表的是队列2.用队列(先进的先出)模拟栈(先进的后出)。

//1.入栈
bool Push_TQTS(TwoQueueToStack* tqts, ELEMTYPE val)
{
tqts->Q1.push(val);
return true;
}
//2.出栈
bool Pop_TQTS(TwoQueueToStack* tqts)
{
if (tqts->Q1.empty() && tqts->Q2.empty())
{
return false;
}
if (!tqts->Q1.empty())
{
int size = tqts->Q1.size();
for (int i = 0; i < size - 1; i++)
{
tqts->Q2.push(tqts->Q1.front());
tqts->Q1.pop();
}
tqts->Q1.pop();
}
else
{
int size = tqts->Q2.size();
for (int i = 0; i < size - 1; i++)
{
tqts->Q1.push(tqts->Q2.front());
tqts->Q2.pop();
}
tqts->Q2.pop();
}
return true;
}
3166

被折叠的 条评论
为什么被折叠?



