题意
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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的运行结果(代码还能做很多优化=-=)
总结
每日一题,欢迎关注我的微信公众号一起讨论!(记录为主)