• 3.4 双端队列


    #include <stdio.h>
    #include <stdlib.h>
    
    #define ERROR 1e5
    
    typedef struct Node {
        int Element;
        struct Node *next, *last;
    }*PtrToNode;
    
    typedef struct DequeRecord {
        struct Node *front, *rear;
    }*Deque;
    
    typedef enum { push, pop, inject, eject, disp, end } Operation;
     
    Deque CreateDeque(){
        Deque deque = (Deque)malloc(sizeof(struct DequeRecord));
        PtrToNode temp = (PtrToNode)malloc(sizeof(struct Node));
        temp->last = NULL;
        temp->next = NULL;
        deque->front = temp;
        deque->rear = temp;
        return deque;
     
    }
     
    int Push(int X, Deque D)
    {
        PtrToNode temp;
        temp = (PtrToNode)malloc(sizeof(struct Node));
        if (!temp)
            return 0;
        temp->Element = X;
        // 空队列情况
        if (D->front == D->rear){
            D->front->next = temp;
            temp->last = D->front;
            temp->next = NULL;
            D->rear = temp;
            return 1;
        }
        // 一般情况
        temp->next = D->front->next;
        temp->last = D->front;
        D->front->next->last = temp;
        D->front->next = temp;
        return 1;
    }
     
    int Pop(Deque D){
        PtrToNode temp;
        int X;
        // 空队列
        if (D->front == D->rear)
            return ERROR;
     
        temp = D->front->next;
        X = temp->Element;
        // 如果只有一个节点的情况
        if (D->front->next == D->rear){
            D->rear = D->front;
            D->rear->next = NULL;
            free(temp);
            return X;
        }
        // 一般情况
        temp->next->last = D->front;
        D->front->next = temp->next;
        free(temp);
        return X;
    }
     
    // 末尾添加一个元素
    int Inject(int X, Deque D){
        PtrToNode temp;
        temp = (PtrToNode)malloc(sizeof(struct Node));
        if (!temp)
            return 0;
        temp->Element = X;
        // 空队列
        if (D->front == D->rear){
            D->front->next = temp;
            temp->last = D->front;
            D->rear = temp;
            return 1;
        }
        D->rear->next = temp;
        temp->next = NULL;
        temp->last = D->rear;
        D->rear = temp;
        return 1;
    }
     
    // 从末尾移除一个元素
    int Eject(Deque D){
        PtrToNode temp;
        int X;
        if (D->front == D->rear)
            return ERROR;
     
        temp = D->rear;
        X = temp->Element;
        D->rear = temp->last;
        D->rear->next = NULL;
        free(temp);
        return X;
    }
    
    Operation GetOp(){
        int op;
        puts("请输入操作码:1 左入队,2 左出队,3 右入队,4 右出队,5 显示队列,6 退出");
        scanf("%d",&op);
        switch(op){
            case 1:return push;
            case 2:return pop;
            case 3:return inject;
            case 4:return eject;
            case 5:return disp;
            case 6:return end;
            default:exit(1);
        }
    }
    
    // 左边front,右边rear,next指向右,带头节点
    void PrintDeque(Deque D){
        PtrToNode p1;
        p1=D->front->next;          // 头节点,front所指单元的next域
        printf("队列中剩余元素:");
        while(p1!=D->rear->next){
            printf("%d ",p1->Element);
            p1=p1->next;
        }
        printf("
    ");
    }     
    
    // 该双端队列可在两端进行入队和出队操作,在左边进行操作的时候要考虑头节点
    
    int main(){
        int e;
        Deque D;
        int done = 0;
     
        D = CreateDeque();
        while (!done) {
            switch(GetOp()) {
            case push:
                puts("push:");
                scanf("%d", &e);
                if (!Push(e, D)) printf("Memory is Full!
    ");
                break;
            case pop:
                e = Pop(D);
                if ( e==ERROR ) printf("Deque is Empty!
    ");
                break;
            case inject: 
                puts("inject:");
                scanf("%d", &e);
                if (!Inject(e, D)) printf("Memory is Full!
    ");
                break;
            case eject:
                e = Eject(D);
                if ( e==ERROR ) printf("Deque is Empty!
    ");
                break;
            case disp:
                PrintDeque(D);
                break;
            case end:
                done = 1;
                break;
            }
        }
        return 0;
    }
  • 相关阅读:
    python中range函数与列表中删除元素
    python碎片记录(一)
    Coursera在线学习---第八节.K-means聚类算法与主成分分析(PCA)
    Coursera在线学习---第七节.支持向量机(SVM)
    Coursera在线学习---第六节.构建机器学习系统
    Coursera在线学习---第五节.Logistic Regression
    梯度下降法与迭代结束条件
    利用并查集求最大生成树和最小生成树(nlogn)
    字符串二分查找
    map容器
  • 原文地址:https://www.cnblogs.com/Alexagender/p/10806313.html
Copyright © 2020-2023  润新知