题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
解答:
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(p2);
}
栈相关代码:
void StackInit(Stack *ps)
{
assert(ps);
ps->top = 0;
}
void StackPush(Stack *ps,int data)
{
assert(ps);
assert(ps->top < MAXSIZE);
ps->array[ps->top++] = data;
}
void StackPop(Stack *ps)
{
assert(ps != NULL);
assert(ps->top>0);
ps->top--;
}
//1为空,0为非空
int StackisEmpty(Stack *ps)
{
return ps->top == 0 ? 1 : 0;
}
int StackTop(Stack *ps)
{
assert(ps);
assert(ps->top > 0);
return ps->array[ps->top-1];
}
基本思想:一个栈实现队列的入,一个栈实现队列的出
假设先将元素都压入stack1,如果将stack1中的元素逐个弹出并压入stack2,则元素在stack2中的顺序正好和原来在stack1中的顺序相反,也就是stack2中的栈顶元素就是队列中先入的元素,然后弹出stack2的栈顶元素,就实现了队列的“先入先出”的特点
当stack2不为空时,在stack2中的栈顶元素是最先进如队列的元素,可以弹出;当stack2为空时,需将stack1中的元素全部弹出并压入stack2.