首页 > 编程语言 > 详细

循环队列的顺序表示和实现(C语言)

时间:2021-03-30 00:33:27      阅读:40      评论:0      收藏:0      [点我收藏+]
#include <stdio.h>
#include <stdlib.h>


//基本操作函数用到的状态码 
#define TRUE 1;
#define FALSE 0;
#define OK 1;
#define ERROR 0;
const int OVERFLOW = -2;
//最大队列长度 
const int MAXSIZE = 100; 


//函数返回值类型,为函数结果状态
typedef int Status; 
//定义队列数据元素类型
typedef char QElemType;
//顺序循环队列定义
typedef struct {
    QElemType *base;  //动态分配存储空间 
    int front;  //头指针(下标),若队列不为空,指向队列头元素 
    int rear;  //尾指针(下标),若队列不为空,指向队列尾元素的下一个位置 
} SqQueue;


//循环队列初始化
Status InitQueue(SqQueue *queue) {
    queue->base=(QElemType*)malloc(sizeof(QElemType)*MAXSIZE);  //分配队列数组空间 
    if(!queue->base) return OVERFLOW;  //分配失败 
    queue->front=0;
    queue->rear=0;
    return OK;
}

//求循环队列的长度 
int QueueLength(SqQueue queue){
    return ((queue.rear-queue.front)+MAXSIZE)%MAXSIZE;  //采用模运算处理差值为负的情况 
} 

//循环队列入队操作
Status EnQueue(SqQueue *queue,QElemType elem){
    if((queue->rear+1)%MAXSIZE==queue->front){  //队满
        return ERROR; 
    } else {
        queue->base[queue->rear]=elem;
        queue->rear=(queue->rear+1)%MAXSIZE;
        return OK;
    }
} 

/* 
* 注:由于循环队列中,队空和队满的情况均为queue->front==queue->rear;
* 为了区分两种情况,有以下几种处理方式:
*   1.另设一个标志来区分队空、队满。 
*   2.另设一个变量,记录元素个数。
*   3.少用一个元素空间。 
* 这里采取第3种方式。那么,队空时:queue->rear==queue->front 、队满时:(queue->rear+1)%MAXSIZE==queue->front
*/

//循环队列出队操作
Status DeQueue(SqQueue *queue,QElemType *elem){
    if(queue->front==queue->rear){  //队空 
        return ERROR; 
    } else {
        *elem=queue->base[queue->front];
        queue->front=(queue->front+1)%MAXSIZE;
        return OK;
    }
} 

//取队头元素
QElemType GetHead(SqQueue queue){
    if(queue.front!=queue.rear){ //队列不为空 
        return queue.base[queue.front];
    } else {
        QElemType null;
        return null;
    }
}


int main(void){
    SqQueue queue1;  //定义一个队列 
    
    //初始化 
    Status initQueueResult = InitQueue(&queue1);
    printf("队列queue1初始化结果:%d\n",initQueueResult);
    
    //元素入队
    QElemType elem1=Y,elem2=C;
    Status enResult = EnQueue(&queue1,elem1);
    printf("入队执行结果:%d\n",enResult);
    EnQueue(&queue1,elem2); //将elem2也入队 
    printf("队尾元素值:%c\n",queue1.base[queue1.rear-1]);
    
    //获得队列当前长度
    int queueLength = QueueLength(queue1);
    printf("队列当前长度:%d\n",queueLength);
    
    //元素出队
    QElemType elem3;  //出队的数据放入elem3 
    Status deResult = DeQueue(&queue1,&elem3);
    printf("出队执行结果:%d\n",deResult);
    printf("出队元素值:%c\n",elem3);
    printf("队尾元素值:%c\n",queue1.base[queue1.rear-1]);
    
    //取队头元素
    QElemType queueHeadValue = GetHead(queue1);
    printf("获取队头元素值:%c\n",queueHeadValue); 
    
    printf("\nEND");
    return 0;
}

技术分享图片

循环队列的顺序表示和实现(C语言)

原文:https://www.cnblogs.com/petitepluie/p/14594321.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!