用两个栈模拟一个队列
栈和队列的问题在面试中经常会被问到,本篇文章教大家如何用两个栈模拟一个队列出来。
先来讲一下栈和队列的基本特点
栈:先进后出,只能在栈顶进行操作。
如:向栈内输入1,2,3,4,5,那么输出则为5,4,3,2,1。就好像一个电梯,先进去的人后出来,进和出都是在末尾操作。
队列:先进先出,队尾插入,队头删除。
如:向队内输入1,2,3,4,5,那么输出也为1,2,3,4,5。把入栈出栈比做出入电梯的话,入队出队更像是在排队,来的晚的人只能排在队伍的末尾。
大体思路:
第一步:定义两个栈,栈1和栈2。
让所有的数据入栈1,这里举例为1,2,3,4,5。
此时栈1的内容为1,2,3,4,5。栈2为空。
第二步:让所有的数据出栈1,入栈2。
此时栈1变成了空栈,栈二的内容为5,4,3,2,1。
第三步:让所有的数据出栈2,即可完成队列的模拟,输出1,2,3,4,5。
代码实现:
//两个栈实现一个队列
#include <stdio.h>
#include <string.h>
#define N 5
typedef struct stack//定义一个栈的数据类型
{
int arr[N];
int count;
}Stack;
int main()
{
Stack stack1,stack2;
memset(&stack1,0,sizeof(Stack));
stack1.count=-1;//初始化栈顶
memset(&stack2,0,sizeof(Stack));
stack2.count=-1;//初始化栈顶
//第一步:让数据入栈1
int i=0;
printf("请输入:");
for(i=0;i<N;i++)
{
scanf("%d",&stack1.arr[i]);
stack1.count++;
}
//第二步:让数据出栈1,入栈2
for(i=0;i<N;i++)
{
stack2.arr[i]=stack1.arr[stack1.count];
stack1.count--;
stack2.count++;
}
//第三步:让数据出栈2,模拟完成
printf("模拟结果为:");
for(i=0;i<N;i++)
{
printf("%d ",stack2.arr[stack2.count]);
stack2.count--;
}
printf("
");
return 0;
}
