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