用队列实现栈

1.题目描述

26426e1191e34918a8bdeff5ea6c075b.png

e42c2d638805408f9d4eb12b923ed161.png 

 2.思路分析

使用双栈,一个进栈,另一个出栈

3.代码实现

typedef struct {

    int* stk;

    int stkSize;

    int stkCapacity;

} Stack;

 

Stack* stackCreate(int cpacity) {

    Stack* ret = malloc(sizeof(Stack));

    ret->stk = malloc(sizeof(int) * cpacity);

    ret->stkSize = 0;

    ret->stkCapacity = cpacity;

    return ret;

}

 

void stackPush(Stack* obj, int x) {

    obj->stk[obj->stkSize++] = x;

}

 

void stackPop(Stack* obj) {

    obj->stkSize--;

}

 

int stackTop(Stack* obj) {

    return obj->stk[obj->stkSize - 1];

}

 

bool stackEmpty(Stack* obj) {

    return obj->stkSize == 0;

}

 

void stackFree(Stack* obj) {

    free(obj->stk);

}

 

typedef struct {

    Stack* inStack;

    Stack* outStack;

} MyQueue;

 

MyQueue* myQueueCreate() {

    MyQueue* ret = malloc(sizeof(MyQueue));

    ret->inStack = stackCreate(100);

    ret->outStack = stackCreate(100);

    return ret;

}

 

void in2out(MyQueue* obj) {

    while (!stackEmpty(obj->inStack)) {

        stackPush(obj->outStack, stackTop(obj->inStack));

        stackPop(obj->inStack);

    }

}

 

void myQueuePush(MyQueue* obj, int x) {

    stackPush(obj->inStack, x);

}

 

int myQueuePop(MyQueue* obj) {

    if (stackEmpty(obj->outStack)) {

        in2out(obj);

    }

    int x = stackTop(obj->outStack);

    stackPop(obj->outStack);

    return x;

}

 

int myQueuePeek(MyQueue* obj) {

    if (stackEmpty(obj->outStack)) {

        in2out(obj);

    }

    return stackTop(obj->outStack);

}

 

bool myQueueEmpty(MyQueue* obj) {

    return stackEmpty(obj->inStack) && stackEmpty(obj->outStack);

}

 

void myQueueFree(MyQueue* obj) {

    stackFree(obj->inStack);

    stackFree(obj->outStack);

}

4.时间复杂度O(1)

空间复杂度O(n)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值