用栈实现队列本质上是用两个后进先出的栈来实现后进后出的效果。
思路:初始化两个栈,一个栈中有数据,一个为空。将非空的栈中的数据依次取出来,放到空栈中,全部元素都处理完之后,在按栈的顺序把原本的空栈中的数据依次取出来。由于栈先进后出的特点,先进入非空栈的元素也就会后出栈,也就会后进入空栈中,也就会先从空栈中出栈。这样就实现了队列先进先出的性质。
代码实现:
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;
}