【leetcode C语言实现】剑指 Offer 09.用两个栈

2020-07-02  本文已影响0人  sunshine_hanxx

题目描述

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

示例 1:
输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]
示例 2:

输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
提示:

1 <= values <= 10000
最多会对 appendTail、deleteHead 进行 10000 次调用

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof

解题思路

由于栈是‘先进后出’的结构,而队列是‘先进先出’的结构,用两个栈实现一个队列时,可以先把元素压入栈1,然后从栈顶到栈底依次弹出元素到栈2,这样栈2的栈顶就是最先‘入队’的元素了。由前面的分析可以看出,当在队列尾部添加元素时,需将元素添加到栈1,若栈1中有元素,直接将需添加的元素压入已有元素的顶部即可,若栈1中没有元素,则需要将需添加的元素放入队列中对应的位置,可采取将栈2中的元素移到栈1,再在栈1的栈顶压入需添加的元素,这样就实现了在尾部添加元素的功能。同理,当需要在队列中删除头部元素时,判断栈2中是否有元素,若有,直接弹出栈顶元素即为头部元素,若栈2为空,则将栈1中的元素都移至栈1,再弹出栈顶元素。

代码

typedef struct {
    int len;
    int top1;
    int top2;
    int *stack1;
    int *stack2;
} CQueue;

CQueue* cQueueCreate() {
    CQueue *queue = (CQueue *)malloc(sizeof(CQueue));
    queue->len = 10000;
    queue->top1 = -1;
    queue->top2 = -1;
    queue->stack1 = malloc(queue->len * sizeof(int));
    queue->stack2 = malloc(queue->len * sizeof(int));
    return queue;
}

void cQueueAppendTail(CQueue* obj, int value) {
    if(obj->top1 == -1)
    {
        while(obj->top2 != -1)
        {
            obj->stack1[++(obj->top1)] = obj->stack2[obj->top2--];
        }
    }
    obj->stack1[++(obj->top1)] = value;
}

int cQueueDeleteHead(CQueue* obj) {
    if(obj->top2 == -1)
    {
        while(obj->top1 != -1)
        {
            obj->stack2[++(obj->top2)] = obj->stack1[(obj->top1)--];
        }
    }
    return obj->top2 == -1 ? -1 : obj->stack2[obj->top2--];
}

void cQueueFree(CQueue* obj) {
    free(obj->stack1);
    free(obj->stack2);
    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);
*/

执行结果

上一篇下一篇

猜你喜欢

热点阅读