zoukankan      html  css  js  c++  java
  • 3.1 队列-顺序存储

    // 队列的顺序存储
    // 队空:front=rear=0
    // 入队:rear+1
    // 出队:front+1
    // 该数组无头元素,出队入队都向上。
    // 会产生假溢出,即rear=MAXSIZE且元素未填满队列时。
    // 如何判断真正的上溢出?rear=MAXSIZE & rear!=0
    // 扩展:区分真假溢出,如果是假溢出,可以reset一下。
    // 但是如果数据量大,reset或不能达到很好的性能
    /* 左front 右rear */
    #include <stdio.h>
    #include <stdlib.h>
    #define MAXSIZE 50
    #define NONE 1e8               //一个元素也没有的时候,front和rear置为None
    
    typedef struct queue{
        int data[MAXSIZE];
        int front,rear;
    }Queue;
    
    void initQueue(Queue *Q){
        Q->front=Q->rear=NONE;
    }
    
    int isFull(Queue *Q){
        if(Q->rear < MAXSIZE | Q->rear==NONE) 
            return 0;         // 未溢出
        return Q->front == 0 ? 1:-1;              // 真溢出、假上溢
    }
    
    // 同样,front==rear时可能为空也可能不为空,空的时候设置front=rear=1e9
    int isEmpty(Queue *Q){
        return Q->rear==NONE ? 1:0;                // 1 未空、剩一个都可出队
    }
    
    int enQueue(Queue *Q,int e){
        if(isFull(Q)) return 0;
        if(isEmpty(Q)){              // 空队的时候特殊处理
            Q->front=Q->rear=0;
            Q->data[0]=e;
        }
        else {
            Q->rear++;
            Q->data[Q->rear]=e;        // 先+1后入队
        }
        return 1;
    }
    
    int deQueue(Queue *Q,int *e){
        if(isEmpty(Q)){ 
            puts("Empty!");
            return 0;     // 先排除是空队的情况
        }
        if(Q->front==Q->rear){       // 如果出队的是最后一个元素,则front不用+1,此时front、rear归零
            *e=Q->data[Q->front];
            Q->front=Q->rear=NONE;
        }
        else
            *e=Q->data[Q->front++];
    
        return 1;
    }
    
    void disp(Queue Q){
        int idx=Q.front;
        if(idx==NONE) {
            puts("none can be display!");
            return;
        }
        while(idx<=Q.rear){
            printf("%d ",Q.data[idx++]);
        }
        printf("
    ");
    }
    
    int main(){
        Queue  Q;
        initQueue(&Q);
        
        for(int i = 0; i<3 ; i++){
            enQueue(&Q,i);
        }
        disp(Q);
        
        int e;
        deQueue(&Q,&e);
        printf("%d ",e);
        
        deQueue(&Q,&e);
        deQueue(&Q,&e);
        printf("%d 
    ",e);
        
        disp(Q);
    
        return 0;
    }
  • 相关阅读:
    Pure播放器
    WPF绑定并转换
    WPF的DataTrigger使用
    NancyFx框架之检测任务管理器
    Asp.Net MVC 5使用Identity之简单的注册和登陆
    AspNetCore使用MySQL
    Head First 设计模式之适配器模式与外观模式
    Head First 设计模式之命令模式(CommandPattern)
    Head First 设计模式之工厂模式(Factory Pattern)
    .NET设计规范————类型设计规范
  • 原文地址:https://www.cnblogs.com/Alexagender/p/10806293.html
Copyright © 2011-2022 走看看