用两个栈模拟一个队列

栈和队列的问题在面试中经常会被问到,本篇文章教大家如何用两个栈模拟一个队列出来。

先来讲一下栈和队列的基本特点

栈:先进后出,只能在栈顶进行操作。

如:向栈内输入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;
}

运行结果:

经验分享 程序员 微信小程序 职场和发展