问题分析:
观察队列和栈的特点,队列是先进先出的,而栈是先进后出的。也就是说,要使用队列实现一个栈,就是利用队列实现先进后出的规律。当pop元素时,最后一个pop的元素为栈的栈顶元素。
问题解决:
利用两个队列实现一个栈,当push元素时,push进非空的队列中;当pop元素时,先将元素依次pop出来,并push进另一个空队列中,直到只剩下一个元素。这是直接pop最后一个元素。这样就实现了栈先进后出的特点。
代码实现:
//两个队列实现一个栈
typedef struct stack
{
SeqQueue q1;
SeqQueue q2;
}stack;
void InitStack(stack* s);
void PushStack(stack* s, StackType elem);
void PopStack(stack* s);
int TopStack(stack* s, StackType* top);
void InitStack(stack* s)
{
assert(s);
InitSeqQueue(&(s->q1));
InitSeqQueue(&(s->q2));
return;
}
void PushStack(stack* s, StackType elem)
{
assert(s);
if(SizeSeqQueue(&(s->q1)) > 0)
PushSeqQueue(&(s->q1), elem);
else
PushSeqQueue(&(s->q2), elem);
return;
}
void PopStack(stack* s)
{
assert(s);
size_t size1 = SizeSeqQueue(&(s->q1));
size_t size2 = SizeSeqQueue(&(s->q2));
if(size1 == 0 && size2 == 0)
return;
SeqQueue* exit = size1 > 0 ? &(s->q1) : &(s->q2);
SeqQueue* entry = size2 == 0 ? &(s->q2) : &(s->q1);
StackType elem;
while(SizeSeqQueue(exit) > 1)
{
FrontSeqQueue(exit, &elem);
PopSeqQueue(exit);
PushSeqQueue(entry, elem);
}
PopSeqQueue(exit);
return;
}
int TopStack(stack* s, StackType* top)
{
assert(s);
assert(top);
size_t size1 = SizeSeqQueue(&(s->q1));
size_t size2 = SizeSeqQueue(&(s->q2));
if(size1 == 0 && size2 == 0)
return 0;
SeqQueue* exit = size1 > 0 ? &(s->q1) : &(s->q2);
SeqQueue* entry = size2 == 0 ? &(s->q2) : &(s->q1);
StackType elem;
while(SizeSeqQueue(exit) > 0)
{
FrontSeqQueue(exit, &elem);
PopSeqQueue(exit);
PushSeqQueue(entry, elem);
}
*top = elem;
return 1;
}