数据结构-用栈实现队列

用栈实现队列本质上是用两个后进先出的栈来实现后进后出的效果。

思路:初始化两个栈,一个栈中有数据,一个为空。将非空的栈中的数据依次取出来,放到空栈中,全部元素都处理完之后,在按栈的顺序把原本的空栈中的数据依次取出来。由于栈先进后出的特点,先进入非空栈的元素也就会后出栈,也就会后进入空栈中,也就会先从空栈中出栈。这样就实现了队列先进先出的性质。

 

代码实现: 

typedef struct
{
	ST pushST;
	ST popST;
}MyQueue;
MyQueue* myQueueCreate()//创建两个栈push和pop
{
	MyQueue* q = (MyQueue*)malloc(sizeof(MyQueue));//先为结构体q申请一块空间(q的结构体类型上面有定义,里面包含两个栈)
	StackInit(&q->pushST);
	StackInit(&q->popST);
	return q;
}
void myQueuePush(MyQueue* obj, int x)
{
	StackPush(&obj->pushST, x);
}//向push栈中加入一个元素x(栈在这里用顺序表表示,所以仅仅直接添加元素即可)
int myQueuePop(MyQueue* obj)
{
	if (StackEmpty(&obj->popST))//如果pop栈为空
	{
		while (!StackEmpty(&obj->pushST))//当push栈不为空时
		{
			StackPush(&obj->popST, StackTop(&obj->pushST));//StackTop返回的是栈中最后一个进入的元素,将其压入pop栈中
			StackPop(&obj->pushST);//将刚刚的最后一个元素从栈中删除
		}//循环往复,直到push栈中一个元素都没有了
	}
	int front = StackTop(&obj->popST);//返回pop栈中的最后一个元素(根据栈后进先出的特点,后进入push栈中的元素也就会先出栈,先进入到pop栈中,这样
	//下来,所有的push栈中的元素全部出栈进入pop栈后,先出的先进,那pop栈中的元素相比于之前push栈中元素的顺序实现了逆序),此时返会pop栈中的最后一个
	//元素,那也就是push栈中的第一个元素。这样该元素先进入push栈中,也先从pop栈中出来,这样就通过两个栈实现了一个队列的作用
	StackPop(&obj->popST);//将返回的那个值在pop队列中删去
	return front;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值