之前写过通过两个栈来实现一个队列的情况,今天是两个队列实现一个栈,其实还是之前说的,队列和栈的区别还是本质上的对数据操作的区别,栈是只能在栈顶位置进行操作,队则是队尾插入元素,队头删除元素。
这是两个队。还是同样选取其中一个队当做入数据的,因为栈是先进后出,所以当你入数据的队列完成入数据的时候,如果想出就需要借用Q2队列,
依次入四个元素1、2、3、4,这时候如果想出元素的话,要出的是最后进的元素4,和两个栈实现队列不同,两个队再怎么倒过来倒过去,1先进入Q1,倒入Q2的话那一定是先从Q1出,所以先进入Q2,所以再出依然是先出1,所以这样是不能实现的。
如果要是想出最后一个入的元素4的话就需要先将他前边的元素,放到Q2中。
在输出结束之后,因为你入元素一直都是入到Q1中,所以在你输出之后,需要将Q2中元素,在倒入到Q1中
也就是Q2还是空的,Q1中已经把最后一个元素出去了。这时候入元素的话还是直接入就可以。
void StackByTwoQueuePush(Queue *s1, Queue *s2, Datatype m)
{
Queuepush(s1,m);
}
入元素的话直接在S1中入元素就可以。
void StackByTwoQueuePop(Queue *s1, Queue *s2)
{
int size = 0;
int i = 0;
if (Queuesize(s1) != 0)
{
size = Queuesize(s1);
for ( i = 0; i<size-1; i++)
{
Queuepush(s2, QueuePop(s1));
}
num = QueuePop(s1);
printf("%d", num);
}
size = Queuesize(s2);
for (i = 0; i<size - 1; i++)
{
Queuepush(s1, QueuePop(s2));
}
}
如果要是出元素的话,首先要将S1中的数据放到S2中,在S1中留一个最后的数据,然后将这个数据赋值给num将num输出即可。在输出结束之后还要将S2中的所有数据返回到S1中。