美文网首页
【leetcode C语言实现】剑指 Offer 09.用两个栈

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

作者: sunshine_hanxx | 来源:发表于2020-07-02 23:21 被阅读0次

    题目描述

    用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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);
    */
    

    执行结果

    相关文章

      网友评论

          本文标题:【leetcode C语言实现】剑指 Offer 09.用两个栈

          本文链接:https://www.haomeiwen.com/subject/olzdqktx.html