• Day15用栈实现队列&用队列实现栈


    用栈实现队列

    /*
    1.两个type为int的数组(栈),大小为100
        第一个栈stackIn用来存放数据,第二个栈stackOut作为辅助用来输出数据
    2.两个指针stackInTop和stackOutTop,分别指向栈顶
    */
    typedef struct {
        int stackInTop, stackOutTop;
        int stackIn[100], stackOut[100];
    } MyQueue;
    
    /*
    1.开辟一个队列的大小空间
    2.将指针stackInTop和stackOutTop初始化为0
    3.返回开辟的队列
    */
    MyQueue* myQueueCreate() {
        MyQueue* queue = (MyQueue*)malloc(sizeof(MyQueue));
        queue->stackInTop = 0;
        queue->stackOutTop = 0;
        return queue;
    }
    
    /*
    将元素存入第一个栈中,存入后栈顶指针+1
    */
    void myQueuePush(MyQueue* obj, int x) {
        obj->stackIn[(obj->stackInTop)++] = x;
    }
    
    /*
    1.若输出栈为空且当第一个栈中有元素(stackInTop>0时),将第一个栈中元素复制到第二个栈中(stackOut[stackTop2++] = stackIn[--stackTop1])
    2.将栈顶元素保存
    3.当stackTop2>0时,将第二个栈中元素复制到第一个栈中(stackIn[stackTop1++] = stackOut[--stackTop2])
    */
    int myQueuePop(MyQueue* obj) {
        //优化:复制栈顶指针,减少对内存的访问次数
        int stackInTop = obj->stackInTop;
        int stackOutTop = obj->stackOutTop;
        //若输出栈为空
        if(stackOutTop == 0) {
            //将第一个栈中元素复制到第二个栈中
            while(stackInTop > 0) {
                obj->stackOut[stackOutTop++] = obj->stackIn[--stackInTop];
            }
        }
        //将第二个栈中栈顶元素(队列的第一个元素)出栈,并保存
        int top = obj->stackOut[--stackOutTop];
        //将输出栈中元素放回输入栈中
        while(stackOutTop > 0) {
            obj->stackIn[stackInTop++] = obj->stackOut[--stackOutTop];
        }
        //更新栈顶指针
        obj->stackInTop = stackInTop;
        obj->stackOutTop = stackOutTop;
        //返回队列中第一个元素
        return top;
    }
    
    //返回输入栈中的栈底元素
    int myQueuePeek(MyQueue* obj) {
        return obj->stackIn[0];
    }
    
    //若栈顶指针均为0,则代表队列为空
    bool myQueueEmpty(MyQueue* obj) {
        return obj->stackInTop == 0 && obj->stackOutTop == 0;
    }
    
    //将栈顶指针置0
    void myQueueFree(MyQueue* obj) {
        obj->stackInTop = 0;
        obj->stackOutTop = 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74

    队列实现栈

    #define LEN 20
    typedef struct queue {
        int *data;
        int head;
        int rear;
        int size;
    } Queue;
    
    typedef struct {
        Queue *queue1, *queue2;
    } MyStack;
    
    Queue *initQueue(int k) {
        Queue *obj = (Queue *)malloc(sizeof(Queue));
        obj->data = (int *)malloc(k * sizeof(int));
        obj->head = -1;
        obj->rear = -1;
        obj->size = k;
        return obj;
    }
    
    void enQueue(Queue *obj, int e) {
        if (obj->head == -1) {
            obj->head = 0;
        }
        obj->rear = (obj->rear + 1) % obj->size;
        obj->data[obj->rear] = e;
    }
    
    int deQueue(Queue *obj) {
        int a = obj->data[obj->head];
        if (obj->head == obj->rear) {
            obj->rear = -1;
            obj->head = -1;
            return a;
        }
        obj->head = (obj->head + 1) % obj->size;
        return a;
    }
    
    int isEmpty(Queue *obj) {
        return obj->head == -1;
    }
    
    MyStack *myStackCreate() {
        MyStack *obj = (MyStack *)malloc(sizeof(MyStack));
        obj->queue1 = initQueue(LEN);
        obj->queue2 = initQueue(LEN);
        return obj;
    }
    
    void myStackPush(MyStack *obj, int x) {
        if (isEmpty(obj->queue1)) {
            enQueue(obj->queue2, x);
        } else {
            enQueue(obj->queue1, x);
        }
    }
    
    int myStackPop(MyStack *obj) {
        if (isEmpty(obj->queue1)) {
            while (obj->queue2->head != obj->queue2->rear) {
                enQueue(obj->queue1, deQueue(obj->queue2));
            }
            return deQueue(obj->queue2);
        }
        while (obj->queue1->head != obj->queue1->rear) {
            enQueue(obj->queue2, deQueue(obj->queue1));
        }
        return deQueue(obj->queue1);
    }
    
    int myStackTop(MyStack *obj) {
        if (isEmpty(obj->queue1)) {
            return obj->queue2->data[obj->queue2->rear];
        }
        return obj->queue1->data[obj->queue1->rear];
    }
    
    bool myStackEmpty(MyStack *obj) {
        if (obj->queue1->head == -1 && obj->queue2->head == -1) {
            return true;
        }
        return false;
    }
    
    void myStackFree(MyStack *obj) {
        free(obj->queue1->data);
        obj->queue1->data = NULL;
        free(obj->queue1);
        obj->queue1 = NULL;
        free(obj->queue2->data);
        obj->queue2->data = NULL;
        free(obj->queue2);
        obj->queue2 = NULL;
        free(obj);
        obj = NULL;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
  • 相关阅读:
    几种类型神经网络学习笔记
    Servlet开发-通过代码案例熟悉HttpServletRequest类
    c_指针
    1.3 互联网的组成
    Peter算法小课堂—DP背包问题
    服务降级hystrix
    Go :验证编译器是否强制执行了复制参数要求(附完整源码)
    API安全
    软件测试 (用例篇)
    【Java基础】23种设计模式介绍
  • 原文地址:https://blog.csdn.net/m0_49284980/article/details/134274074