虫子 栈转队列 队列转栈 内核必备,基本算法,linux二次发育,项目远见

举报
虫子VV 发表于 2022/04/21 13:55:20 2022/04/21
【摘要】 用栈实现队列 题目 队结构体 队初始化 入“队” 出“队”并取出队元素 返回队头 判断队空 队列销毁 队列代码(接口代码去我之前文章取) 算法开启小码农栈血脉 ==队列接口见 算法开启小码农队列血脉== 用队列实现栈 题目 栈结构体 栈初始化 入“栈” 出“栈”并取栈顶元素 取栈顶元素 判断栈空 栈销毁 用栈实现队列 题目 队结构体typedef struct { ST PushST...

用栈实现队列

题目

image-20211102223625269

队结构体

typedef struct {
    ST PushST;//入队栈
    ST PopST;//出队栈
} MyQueue;

队初始化

MyQueue* myQueueCreate() {
    MyQueue* q = (MyQueue*)malloc(sizeof(MyQueue));
    StackInit(&q->PushST);//初始化入队栈
    StackInit(&q->PopST);//初始化出队栈
    return q;
}

入“队”

void myQueuePush(MyQueue* obj, int x) {
    StackPush(&obj->PushST,x);
}

出“队”并取出队元素

int myQueuePop(MyQueue* obj) {
    //如果出队栈为空就从入队栈里面全导过来
    if(StackEmpty(&obj->PopST))
    {
        //导数据
        while(!StackEmpty(&obj->PushST))
        {
            //入队栈栈顶元素拿出来给出队栈
            StackPush(&obj->PopST,StackTop(&obj->PushST));
            //栈把入队栈的栈顶元素pop掉
            StackPop(&obj->PushST);
        }
    }
    //这时就说明都倒完了,所以开始pop掉出队栈元素
    int tmp = StackTop(&obj->PopST);
    StackPop(&obj->PopST);
    return tmp;
}

返回队头

int myQueuePeek(MyQueue* obj) {
    //如果出队栈为空就从入队栈里面全导过来
    if(StackEmpty(&obj->PopST))
    {
        //导数据
        while(!StackEmpty(&obj->PushST))
        {
            //入队栈栈顶元素拿出来给出队栈
            StackPush(&obj->PopST,StackTop(&obj->PushST));
            //栈把入队栈的栈顶元素pop掉
            StackPop(&obj->PushST);
        }
    }
    //就是出队函数那样只取队头而已
    return StackTop(&obj->PopST);
}

判断队空

bool myQueueEmpty(MyQueue* obj) {
    return StackEmpty(&obj->PushST) && StackEmpty(&obj->PopST);
}

队列销毁

void myQueueFree(MyQueue* obj) {
    StackDestroy(&obj->PushST);
    StackDestroy(&obj->PopST);
    free(obj);
}

image-20211103001539223

队列代码(接口代码去我之前文章取) 算法开启小码农栈血脉

typedef struct {
    ST PushST;//入队栈
    ST PopST;//出队栈
} MyQueue;


MyQueue* myQueueCreate() {
    MyQueue* q = (MyQueue*)malloc(sizeof(MyQueue));
    StackInit(&q->PushST);//初始化入队栈
    StackInit(&q->PopST);//初始化出队栈
    return q;
}

void myQueuePush(MyQueue* obj, int x) {
    StackPush(&obj->PushST,x);
}

int myQueuePop(MyQueue* obj) {
    //如果出队栈为空就从入队栈里面全导过来
    if(StackEmpty(&obj->PopST))
    {
        //导数据
        while(!StackEmpty(&obj->PushST))
        {
            //入队栈栈顶元素拿出来给出队栈
            StackPush(&obj->PopST,StackTop(&obj->PushST));
            //栈把入队栈的栈顶元素pop掉
            StackPop(&obj->PushST);
        }
    }
    //这时就说明都倒完了,所以开始pop掉出队栈元素
    int tmp = StackTop(&obj->PopST);
    StackPop(&obj->PopST);
    return tmp;
}

int myQueuePeek(MyQueue* obj) {
    //如果出队栈为空就从入队栈里面全导过来
    if(StackEmpty(&obj->PopST))
    {
        //导数据
        while(!StackEmpty(&obj->PushST))
        {
            //入队栈栈顶元素拿出来给出队栈
            StackPush(&obj->PopST,StackTop(&obj->PushST));
            //栈把入队栈的栈顶元素pop掉
            StackPop(&obj->PushST);
        }
    }
    //就是出队函数那样只取队头而已
    return StackTop(&obj->PopST);
}

bool myQueueEmpty(MyQueue* obj) {
    return StackEmpty(&obj->PushST) && StackEmpty(&obj->PopST);
}

void myQueueFree(MyQueue* obj) {
    StackDestroy(&obj->PushST);
    StackDestroy(&obj->PopST);
    free(obj);
}

==队列接口见 算法开启小码农队列血脉==

用队列实现栈

题目

image-20211101211340400

栈结构体

typedef struct {
    Queue q1;
    Queue q2;//两个队列
} MyStack;

栈初始化

MyStack* myStackCreate() {
    MyStack* st = (MyStack*)malloc(sizeof(MyStack));
    QueueInit(&st->q1);
    QueueInit(&st->q2);
    return st;
}

入“栈”

void myStackPush(MyStack* obj, int x) {
    if(!QueueErase(&obj->q1))
    {
        QueuePush(&obj->q1,x);
    }
    else//两个都为空时push给q2
    {
        QueuePush(&obj->q2,x);
    }
}

出“栈”并取栈顶元素

int myStackPop(MyStack* obj) {
    Queue* emptyQ = &obj->q1;
    Queue* nonemptyQ = &obj->q2;//假设q2空,q1非空
    //不是我们就互换位置
    if(!QueueErase(emptyQ))
    {
        nonemptyQ = &obj->q1;
        emptyQ = &obj->q2;
    }
    //非空队长大于一时朝空队里面挪动数据
    while(QueueSize(nonemptyQ)>1)
    {
        //把非队空的对头数拿出push给对空的
        QueuePush(emptyQ,QueueFront(nonemptyQ));
        //然后把非队空的对头数pop掉
        QueuePop(nonemptyQ);
    }
    //因为要返回栈顶数据所以存完再pop
    int tmp = QueueFront(nonemptyQ);
    //此时非空队就只还有一个数据,pop掉就行
    QueuePop(nonemptyQ);
    return tmp;
}

取栈顶元素

int myStackTop(MyStack* obj) {
    //谁不为空就去谁队尾数据
    if(!QueueErase(&obj->q1))
    {
        return QueueBack(&obj->q1);
    }
    else
    {
        return QueueBack(&obj->q2);
    }
}

判断栈空

bool myStackEmpty(MyStack* obj) {
    return QueueErase(&obj->q1)&&QueueErase(&obj->q2);
}

栈销毁

void myStackFree(MyStack* obj) {
    QueueDestroy(&obj->q1);
    QueueDestroy(&obj->q2);
    free(obj);
}

image-20211102002834360

typedef struct {
    Queue q1;
    Queue q2;//两个队列
} MyStack;


MyStack* myStackCreate() {
    MyStack* st = (MyStack*)malloc(sizeof(MyStack));
    QueueInit(&st->q1);
    QueueInit(&st->q2);
    return st;
}

void myStackPush(MyStack* obj, int x) {
    if(!QueueErase(&obj->q1))
    {
        QueuePush(&obj->q1,x);
    }
    else//两个都为空时push给q2
    {
        QueuePush(&obj->q2,x);
    }
}

int myStackPop(MyStack* obj) {
    Queue* emptyQ = &obj->q1;
    Queue* nonemptyQ = &obj->q2;//假设q2空,q1非空
    //不是我们就互换位置
    if(!QueueErase(emptyQ))
    {
        nonemptyQ = &obj->q1;
        emptyQ = &obj->q2;
    }
    //非空队长大于一时朝空队里面挪动数据
    while(QueueSize(nonemptyQ)>1)
    {
        //把非队空的对头数拿出push给对空的
        QueuePush(emptyQ,QueueFront(nonemptyQ));
        //然后把非队空的对头数pop掉
        QueuePop(nonemptyQ);
    }
    //因为要返回栈顶数据所以存完再pop
    int tmp = QueueFront(nonemptyQ);
    //此时非空队就只还有一个数据,pop掉就行
    QueuePop(nonemptyQ);
    return tmp;
}

int myStackTop(MyStack* obj) {
    //谁不为空就去谁队尾数据
    if(!QueueErase(&obj->q1))
    {
        return QueueBack(&obj->q1);
    }
    else
    {
        return QueueBack(&obj->q2);
    }
}

bool myStackEmpty(MyStack* obj) {
    return QueueErase(&obj->q1)&&QueueErase(&obj->q2);
}

void myStackFree(MyStack* obj) {
    QueueDestroy(&obj->q1);
    QueueDestroy(&obj->q2);
    free(obj);
}
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。