剑指offer.09 两个栈实现一个队列

题意

  用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

解题思路

栈与队列的特点:
栈为先结后出,而队列为先进先出

  将第一个栈作为数据输入栈,执行入队操作时将数据压入第一个栈;另一个栈作为数据输出栈,用于出队时将数据弹出。
  每次执行出队操作时,若第二个栈为空则将第一个栈的全部数据依次弹出并压入第二个栈,实现了第一个栈中数据位置的翻转,也就符合了队列从队首往队尾的顺序。

代码实现

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

/* 栈节点 链表实现 */
typedef struct stack {
	int value;
	struct stack *next;
} stack_t;

/* 队列 */
typedef struct {
	stack_t *stack_0;
	stack_t *stack_1;
} CQueue;

/* 压栈操作,采用头插法 */
void stack_append(stack_t *stack, int value)
{
	stack_t *node = NULL; 

	if (stack == NULL)
		return ;

	node = (stack_t *)malloc(sizeof(stack_t));
	if (node == NULL)
		return ;

	/* head instert */
	node->value = value;
	node->next = stack->next;
	stack->next = node;
}

/* 出栈操作 */
int stack_pull(stack_t *stack)
{
	stack_t *node;
	int value = -1;

	if (stack == NULL)
		return value;

	node = stack->next;
	if (node == NULL) {
		return value;
	} else {
		stack->next = node->next;
		value = node->value;
		free(node);
		return value;
	}
}

CQueue* cQueueCreate() 
{
	CQueue *node = (CQueue *)malloc(sizeof(CQueue));
	
	if (node == NULL)
		return NULL;

	node->stack_0 = (stack_t *)malloc(sizeof(stack_t));
	if (node->stack_0 == NULL) {
		free(node);
		return NULL;
	}

	node->stack_1 = (stack_t *)malloc(sizeof(stack_t));
	if (node->stack_1 == NULL) {
		free(node->stack_0);
		free(node);
		return NULL;
	}
	
	node->stack_0->next = NULL;
	node->stack_1->next = NULL;

	return node;
}

void cQueueAppendTail(CQueue* obj, int value) 
{
	if (obj == NULL)
		return ;

	stack_append(obj->stack_0, value);
}

int cQueueDeleteHead(CQueue* obj) {
	stack_t *node;
	int value;

	if (obj == NULL)
		return -1;

	if (obj->stack_1->next == NULL && obj->stack_0->next == NULL) {	
		return -1;
	} else if (obj->stack_1->next == NULL) {
		while ((value=stack_pull(obj->stack_0)) != -1)
			stack_append(obj->stack_1, value);

		return stack_pull(obj->stack_1);
	} else {
		return stack_pull(obj->stack_1);
	}
}

void cQueueFree(CQueue* obj) {
	int value = -1;

	while ((value=stack_pull(obj->stack_0)) != -1)
		continue;

	while ((value=stack_pull(obj->stack_1)) != -1)
		continue;

	free(obj->stack_0);
	free(obj->stack_1);
	free(obj);
}

/**
 * Your CQueue struct will be instantiated and called as such:
 * CQueue* obj = cQueueCreate();
 * cQueueAppendTail(obj, value);

 * int param_2 = cQueueDeleteHead(obj);

 * cQueueFree(obj);
*/

运行结果

以下为leetcode的运行结果(代码还能做很多优化=-=)
在这里插入图片描述

总结

  每日一题,欢迎关注我的微信公众号一起讨论!(记录为主)
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值