栈和队列面试题(三)

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


猜你喜欢

转载自blog.csdn.net/liru_1996/article/details/80075789