3.使用两个队列实现一个栈
思想:创建两个队列,栈的特点为后进先出,而队列是先进先出,所以要出栈时,要先将队列1的元素出队列,同时入队列2中(此时的队列2为空),直到队列1中只有一个元素,此时这个元素就是要出栈的元素;入栈时,选择不为空的队列入队列即可;
代码实现:
#include <stdio.h> #include <stdlib.h> #include "seqqueue.h" #include "seqqueue.c" typedef struct StackBy2Queue { SeqQueue queue1; SeqQueue queue2; }StackBy2Queue; void StackInit(StackBy2Queue* stack){ if(stack == NULL){ return; } SeqQueueInit(&stack->queue1); SeqQueueInit(&stack->queue2); } void StackPush(StackBy2Queue* stack,SeqQueueType value){ if(stack == NULL){ return; } SeqQueue* input = stack->queue1.size != 0 ? &stack->queue1:&stack->queue2; SeqQueuePush(input,value); } void StackPop(StackBy2Queue* stack){ if(stack == NULL){ return; } if(stack->queue1.size == 0 && stack->queue2.size == 0){ //空栈 return; } //先搞清楚谁向谁倒腾 SeqQueue* from = NULL; SeqQueue* to = NULL; if(stack->queue1.size > 0){ from = &stack->queue1; to = &stack->queue2; }else{ from = &stack->queue2; to = &stack->queue1; } //要把from中的元素倒腾到to中 //并且一直倒腾到from中只有一个元素 while(1){ if(from->size == 1){ //已经要停止倒腾了,此时的from的队首元素就是栈顶元素 break; } SeqQueueType value; SeqQueueFront(from , &value); SeqQueuePop(from); SeqQueuePush(to,value); } //把最后一个元素删除掉,就是出栈 SeqQueuePop(from); return; } int StackTop(StackBy2Queue* stack,SeqQueueType* output_value){ if(stack == NULL ||output_value == NULL){ return 0; } if(stack->queue1.size == 0 && stack->queue2.size == 0){ //空栈 return 0; } //先搞清楚谁向谁倒腾 SeqQueue* from = NULL; SeqQueue* to = NULL; if(stack->queue1.size > 0){ from = &stack->queue1; to = &stack->queue2; }else{ from = &stack->queue2; to = &stack->queue1; } //要把from中的元素倒腾到to中 //并且一直倒腾到from中只有一个元素 SeqQueueType value; while(1){ if(from->size == 1){ //已经要停止倒腾了,此时的from的队首元素就是栈顶元素 break; } SeqQueueFront(from,&value); SeqQueuePop(from); SeqQueuePush(to,value); } //把最后一个这个元素取出来,赋值给output_value SeqQueueFront(from,output_value); SeqQueuePop(from); SeqQueuePush(to,*output_value); return 1; }
test.c
#if 1 #include <stdio.h> #define TEST_HEADER printf("\n============================%s=============================\n",__FUNCTION__) void TestStack(){ TEST_HEADER; StackBy2Queue stack; StackInit(&stack); StackPush(&stack,'a'); StackPush(&stack,'b'); StackPush(&stack,'c'); StackPush(&stack,'d'); SeqQueueType value; int ret; ret = StackTop(&stack,&value); printf("ret expected 1,actual %d\n",ret); printf("value expected d,actual %c\n",value); StackPop(&stack); ret = StackTop(&stack,&value); printf("ret expected 1,actual %d\n",ret); printf("value expected c,actual %c\n",value); StackPop(&stack); ret = StackTop(&stack,&value); printf("ret expected 1,actual %d\n",ret); printf("value expected b,actual %c\n",value); StackPop(&stack); ret = StackTop(&stack,&value); printf("ret expected 1,actual %d\n",ret); printf("value expected a,actual %c\n",value); StackPop(&stack); } int main(){ TestStack(); return 0; } #endif