基本思想:一个栈实现队列的入,一个栈实现队列的出
假设先将元素都压入stack1,如果将stack1中的元素逐个弹出并压入stack2,则元素在stack2中的顺序正好和原来在stack1中的顺序相反,也就是stack2中的栈顶元素就是队列中先入的元素,然后弹出stack2的栈顶元素,就实现了队列的“先入先出”的特点
当stack2不为空时,在stack2中的栈顶元素是最先进如队列的元素,可以弹出;当stack2为空时,需将stack1中的元素全部弹出并压入stack2.
代码实现如下:
typedef struct SQueue{
Stack stack1;//入队
Stack stack2;//出队
}SQueue;
void QueuePush(SQueue *ps, int data)
{
Stack *p1, *p2;
p1 = &(ps->stack1);
p2 = &(ps->stack2);
StackPush(p1, data);
}
void QueuePop(SQueue *ps)
{
Stack *p1, *p2;
p1 = &(ps->stack1);
p2 = &(ps->stack2);
int data;
//栈p2为空的情况下,应先将栈1 的数据弹出到栈2里
//栈2为非空时,直接将栈2的栈顶元素弹出
//栈2 的元素总是最先入的
if (StackisEmpty(p2)){
while (!StackisEmpty(p1)){
data = StackTop(p1);
StackPop(p1);
StackPush(p2,data);
}
}
StackPop