问题分析:
观察队列和栈的特点,队列是先进先出的,而栈是先进后出的。也就是说,要使用队列实现一个栈,就是利用队列实现先进后出的规律。当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; }