C语言实现循环队列

来源:互联网 发布:linux echo 编辑:程序博客网 时间:2024/05/18 00:17

队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另外一端删除元素。简单的说这个就是我们生活中排队的模型。

简单的队列实现这里就不说了,简单地给出结构如下:

typedef struct{    QElemType * base;    int font;   //队列头游标    int rear;   //队列尾游标}SqQueue;

这里写图片描述

以上是简单队列的示意图,图片来自百度,侵删。

考虑这样的情况:假设当前为队列分配的最大空间为10,队列的头游标在5,尾游标在9,那么如果再添加一个新的元素势必会因数组越界而导致程序错误。然而此时又不宜像顺序表那样扩大存粗空间,因为队列的实际的可用空间并未占满。

一个较为巧妙的方法是将顺序队列臆想成一个环状空间,称之为循环队列。

这里写图片描述

判断队列是否满:

仅凭借Q.front == Q.rear是不足以判断队列是否满,可用的两种处理方法是:

1.另外设置一个标志位以区别队列是空还是满

2.牺牲一个存储空间,约定以队列头指针在队列尾指针的下一个位置(环状的下一个位置)上作为队列满的标志,即上图d2

循环队列有一个明显的问题,存储空间,即队列长度是不可变的,如果无法预知长度,建议使用链式队列

实现代码:

#include <iostream>#include <stdio.h>#include <stdlib.h>using namespace std;#define MAXQSIZE 10typedef int QElemType;typedef struct{    QElemType * base;    int font;   //队列头游标    int rear;   //队列尾游标}SqQueue;//初始化循环队列int InitSqQueue(SqQueue &Q){    Q.base = (QElemType * )malloc(MAXQSIZE*sizeof(QElemType));    if(!Q.base) return 0;    Q.font = Q.rear = 0;    return 1;}//添加元素int InsertQueue(SqQueue &Q ,QElemType e){    if((Q.rear+1) % MAXQSIZE == Q.font) return 0;    Q.base[Q.rear] = e;    Q.rear = (Q.rear+1) % MAXQSIZE;    return 1;}//删除元素int DeQueue(SqQueue &Q,QElemType &e){    if(Q.font == Q.rear) return -1;    e = Q.base[Q.font];    Q.font = (Q.font+1) % MAXQSIZE;    return 1;}int QueueLength(SqQueue &Q){    return (Q.rear - Q.font + MAXQSIZE) % MAXQSIZE;}int main(){    SqQueue Q;    InitSqQueue(Q);    for(int i=0;i<9;i++)    {        InsertQueue(Q,i);    }    printf("队列中的元素有%d个\n",QueueLength(Q));    int e;    for(int j=0;j<5;j++)    {        DeQueue(Q,e);        printf("删除元素 e = %d \n",e);    }    printf("队列中的元素有%d个\n",QueueLength(Q));}

这里写图片描述

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 换公司后公积金怎么办 换工作了住房公积金怎么办 以前买的户口怎么办 上海落户积分不够怎么办 带坏受孕了怎么办 对公转账转错了怎么办 对公转错账怎么办 银行卡转错了怎么办 人户分离证明怎么办 暂居证怎么办才快 房产证户口本信息泄漏怎么办 户主迁走了户口怎么办 户口本丢了应该怎么办 户口本遗失了应该怎么办 户口迁出河南怎么办居住证 居住证学历写错怎么办 换单位了档案怎么办 辞职一年了档案怎么办 上海租房网签怎么办 户口本主页掉了怎么办 居转户办理中离职怎么办 上海居转户没有职称怎么办 上海居转户0税单怎么办 居转户出现零税怎么办 遇假记者敲诈怎么办 液氮挥发太快怎么办 高铁上空调太冷怎么办 文登市昆嵛酒店怎么办 厦漳泉同城包怎么办 亲戚朋友总是蹭吃蹭喝怎么办啊 开车上班总有蹭车的怎么办 食堂的饭难吃怎么办 租亲戚的房子怎么办 饭菜罩子生虫怎么办 食堂吃出虫子怎么办 缺氧没有煤炭了怎么办 缺氧没有金属了怎么办 白色衣服带红色怎么办 如果买方退回假货怎么办 饰品氧化变黑了怎么办 银放久了变黄怎么办