数据结构-用栈实现队列

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

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

数据结构-用栈实现队列 

代码实现: 

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;
}

上一篇:二叉树的迭代遍历统一写法


下一篇:剑指offer#9