3.1 队列-顺序存储

摘要:
//队列按顺序存储//队列为空:front=real=0//队列入口:real+1//队列出口:front+1//数组没有标头,队列入口和出口向上//将发生假溢出,即当real=MAXSIZE且元素未填充队列//如何判断真溢出//但是,如果数据量较大,重置可能无法实现良好的性能/*左前右real*/#include #include<stdlib h>#define MAXSIZE 50#define NONE1e8//当没有元素时,front和real设置为Nonetyppedfstructqueue{intdata[MAXSIZE];intfront,real;}队列voinitQueue{Q-˃front=Q-˃rear=NONE;}IntisFull{ifretrn0;//返回无溢出Q-˃front==0?
// 队列的顺序存储
// 队空: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;
}

免责声明:文章转载自《3.1 队列-顺序存储》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#批量附加指定目录下的所有数据库文件到数据库中高精地图技术专栏 | 基于空间连续性的异常3D点云修复技术下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

matlab读取cvs文件的几种方法

matlab读取CVS文件的几种方法:1,实用csvread()函数csvread()函数有三种使用方法:1、M=csvread2、M=csvread3、M=csvread第一种方法中,直接输入文件名,将数据读到矩阵M中。textscan函数读取的结果会存在cell数组中。...

webpack打包(1)

Webpack可以处理js/json资源。生成环境比开发环境具有更多的功能来压缩代码。它可以将ES6模块化为浏览器在webpack.config中识别的模块操作命令npmiwebpackwebpack-cli-g npminit npmiwebpack-cli-D配置并运行webpack以将webpack.config.js文件打包...

db2 reorg详解

reorgchk,检查tableindex是否需要重组。reorg重组,重新放置数据位置。5)db.tb_reorg_req运行状况指示器处于ATTENTION状态。可以分为对系统表和用户表两部分分别进行REORGCHK:1)针对系统表进行REORGCHKdb2reorgchkupdatestatisticsontablesystem使用UPDATESTAT...

FastDFS安装

FastDFS安装包FastDFS安装包百度网盘密码aj4f下载后把安装包移动到服务器里面这里我把安装包放在opt/FastDFSFastDFS安装安装环境在本地安装就需要安装gcc环境yum-yinstallcmakemakegcc-c++在阿里服务器因为帮你配置好了的解压libfastcommon到指定目录解压-C指定解压的目录#解压[root@rzkF...

flutter vscode+第三方安卓模拟器

1.首先打开夜曲模拟器2.Win+R,选择cmd,在第三方模拟器安装目录的bin目录下输入夜曲模拟器,然后运行命令:nox_Adb.execonnect127.0.0.1:620013。打开项目终端的vscode并建立连接:adbconnect127.00.1:62001(夜神模拟器的默认端口)4。查看连接:adbdevices或不使用第三方模拟器:1.打开...

IDEA(MAC) 快捷键

从日食到IDEA;从Windows到MAC,我不习惯录制一些日常使用的快捷键。1.格式代码命令+alt+L2。导出包alt+entercontrol+alt+O3。自动生成此类型的对象命令+alt+V4。复制命令行+d5。上下移动一行代码shift+alt+上/下箭头6。上下移动代码Shift+Command+上下键6。生成foreacher7。生成列表遍历...