题目:用两个栈实现一个队列,队列的声明如下:请实现它的两个函数appendTrail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。
思路
两个栈,先进后出,实现先进先出
先入一个栈L2,再出栈L2,入另一个栈L1,出栈L1,即可
条件保证
1,L2为空,L1,不为空
2,L2,不为空,L1不为空
3,L1,L2为空
源代码
#include "stdio.h"
#include "stdlib.h"
#include "stack.h"
void appendTail(LiStack &L1,LiStack &L2,int e)
{
int p;
Push(L1,e);
printf("%d入队列1\n",e);
if(StackEmpty(L2))
{
Pop(L1,p);
Push(L2,p);
printf("%d出队列1入队列2\n",p);
while(!StackEmpty(L1))
{
Pop(L1,p);
Push(L2,p);
printf("%d出队列1入队列2\n",p);
}
}
}
void deleteHead(LiStack &L1,LiStack &L2)
{
int e,p;
Pop(L2,e);
printf("%d出队列2\n",e);
if(StackEmpty(L2))
{
while(!StackEmpty(L1))
{
Pop(L1,p);
Push(L2,p);
printf("%d出队列1入队列2\n",p);
}
}
}
void print(LiStack &L1,LiStack &L2)
{
printf("输出队列1:");
if(StackEmpty(L1))
printf("空\n");
int e;
while(!StackEmpty(L1))
{
Pop(L1,e);
printf("%d ",e);
}
printf("输出队列2:");
if(StackEmpty(L2))
printf("空\n");
while(!StackEmpty(L2))
{
Pop(L2,e);
printf("%d ",e);
}
}
int main()
{
LiStack L1;
LiStack L2;
InitStack(L1);
InitStack(L2);
appendTail(L1,L2,2);
appendTail(L1,L2,3);
appendTail(L1,L2,4);
deleteHead(L1,L2);
print(L1,L2);
return 0;
}
结果:
2入队列1
2出队列1入队列2
3入队列1
4入队列1
2出队列2
4出队列1入队列2
3出队列1入队列2
输出队列1:空
输出队列2:3 4