美文网首页
【算法题】29. 用两个栈实现队列

【算法题】29. 用两个栈实现队列

作者: _涼城 | 来源:发表于2022-05-26 07:26 被阅读0次

题目

    用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTaildeleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。

若队列中没有元素,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]

思路

    首先,要明确栈是一种只能在一端进行插入和删除操作的特殊线性结构,允许进行插入和删除操作的一端为栈顶,另外一段为栈底。而队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。

    由于队列是在前端进行删除的,而栈底是不支持删除的,因此,我们可以通过将栈 A的数据压入栈 B ,这样栈A的栈底就变成了栈B 的栈顶,我们可以通过对栈 B的栈顶进行删除。

输入为函数调用顺序和参数,当 appendTail 时压栈的数据,输出为 deleteHead 函数返回值。

代码实现

  1. 实现栈的数据结构和基本功能入栈、出栈、栈空、获取栈顶数据和释放功能。

    typedef struct 
    {
        int top;
        int cpacity;
        int *data;
    }SeqStack;
    
    
    SeqStack* Init_seqStack(int cpacity){
        SeqStack *ret = (SeqStack *)malloc(sizeof(SeqStack));
        if (!ret)
        {
            return NULL;
        }else{
            ret->top = -1;
            ret->data = malloc(sizeof(int) * cpacity);
            return ret;
        }
    }
    
    /*
        压栈
        */
    void push_stack(SeqStack *s,int value){
        //判断是否栈满
        if (s->top == s->cpacity - 1)
        {
            return;
        }
        s->top++;
        s->data[s->top] = value;
    }
    void pop_stack(SeqStack *s){
        if (s->top >= 0)
        {
           s->top--;
        }
    }
    bool isEmptyStack(SeqStack* s){
        return (s->top == -1);
    }
    
    int getStackTop(SeqStack *s){
        return s->data[s->top];
    }
    
    void stackFree(SeqStack* obj) {
        free(obj->data);
    }
    
    
  1. 实现栈 A 数据压入栈 B

    void atob(SeqStack *a,SeqStack *b) {
        while (!isEmptyStack(a)) {
            push_stack(b, getStackTop(a));
            pop_stack(a);
        }
    }
    
  1. 定义队列的数据结构为两个栈 inStack 和 outStack,实现appendTaildeleteHead

    typedef struct {
       SeqStack *inStack;
       SeqStack *outStack;
    } CQueue;
    CQueue* cQueueCreate() {
       CQueue *cqueue = (CQueue *)malloc(sizeof(CQueue));
       cqueue->inStack = Init_seqStack(10000);
       cqueue->outStack = Init_seqStack(10000);
       return cqueue;
    }
    
    void in2out(CQueue* obj) {
        while (!isEmptyStack(obj->inStack)) {
            push_stack(obj->outStack, getStackTop(obj->inStack));
            pop_stack(obj->inStack);
        }
    }
    
    
    void cQueueAppendTail(CQueue* obj, int value) {
          push_stack(obj->inStack, value);
    }
    
    int cQueueDeleteHead(CQueue* obj) {
        if (isEmptyStack(obj->outStack)) {
            if (isEmptyStack(obj->inStack)) {
                return -1;
            }
            in2out(obj);
        }
        int x = getStackTop(obj->outStack);
        pop_stack(obj->outStack);
        return x;
    }
    
    void cQueueFree(CQueue* obj) {
        stackFree(obj->inStack);
        stackFree(obj->outStack);
        free(obj);
    }
    
    
    
    

相关文章

  • 数据结构——栈和队列

    用数组实现栈和队列 用栈实现队列 用队列实现栈 栈和队列的经典算法题最小间距栈宠物收养所 数组实现栈和队列 用数组...

  • 【算法题】29. 用两个栈实现队列

    题目 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,...

  • leecode刷题(26)-- 用栈实现队列

    leecode刷题(26)-- 用栈实现队列 用栈实现队列 使用栈实现队列的下列操作: push(x) -- 将一...

  • 2019-03-14

    【编程题】 用两个栈实现队列 【剑指系列】用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为...

  • JZ-005-用两个栈实现队列

    用两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。题...

  • 用两个栈实现队列

    原题链接 用两个栈实现队列 题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int...

  • 队列之-队列实现栈

    一、队列实现栈核心算法概述 之前已经描述过了用栈实现队列的功能,见栈系列之-实现队列,那么同样队列也可以用来实现栈...

  • 面试题9: 用两个栈实现队列

    9-1 用两个栈实现队列 9-2 用两个队列实现栈

  • 栈&队列

    一、栈&队列总结 栈/队列的应用接雨水验证栈序列滑动窗口的最大值 栈/队列的特殊实现用两个栈实现队列用两个队列实现...

  • 用两个栈实现队列,用两个队列实现堆栈

    参考:剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈 用两个栈实现队列stack1作为入...

网友评论

      本文标题:【算法题】29. 用两个栈实现队列

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