数据结构之循环队列

懒癌患者敲打敲打

循环队列的基本操作实现

1.构造循环队列原因:队列初始化时,令front=rear=0,每当插入一个元素时,“尾指针加1”;

删除一个元素时,“头指针加1”(注意指针都是加一)。

因此,在非空队列中,头指针始终指向队列的头元素,二尾指针始终指向队列的尾元素。

当删除一定量的元素后,队首则放空,而队尾若到达了边界值,则无法继续入队,这种情况下,造成了空间的浪费。

所以一个巧妙的方法就是,构造一个循环队列,充分利用空间。

2.循环队列判空、满的解决:

由于队列的判空或满的情况冲突,因此采用以下两种方法来解决这种问题:

(1)另外设置一个标志位以区别队列是“空”还是“满”;

(2)少用一个元素空间,约定“当队列头指针在队列尾指针的下一位(指环状的下一个位置)”上作为队列满“满”的标志。 

即当队列是空的时候 满足条件Q.front==Q.rear;当队列满的时候满足条件(Q.rear+1)%MAXSIZE == Q.front。MAXSIZE指

代队列的最大长度。

3.队列当前长度的获取:(Q.rear-Q.front+MAXSIZE)%MAXSIZE

4.循环基本操作队列实现(C语言)

#include<iostream>
#include<cstdlib>
using namespace std;
#define MaxLength 100
typedef int Elemtype;
typedef struct {
    Elemtype *base;//初始化的动态分配存储空间
    int front;//头指针,若队列不空,则指向队列的头元素
    int rear;//尾指针,若队列不空,指向队尾元素的下一个位置
}SqQueue;

/*循环队列基本操作的实现*/

//1.初始化,构造一个空队列
int init(SqQueue &Q){
    Q.base = (Elemtype *)malloc(MaxLength*sizeof(Elemtype));//申请内存空间,其类型为Elemtype
    if(!Q.base) exit(0);
    Q.front = Q.rear = 0; //初始化
    return 1;
}

//2.求循环队列的长度
int length(SqQueue &Q){
    return (Q.rear-Q.front + MaxLength)%MaxLength;
}

//3.插入一个元素
int insertRear(SqQueue &Q,Elemtype e){
    if((Q.rear+1)%MaxLength == MaxLength){
        cout<<"队列已满";
        return 0;
    }
    Q.base[Q.rear] = e;
    Q.rear = (Q.rear+1)%MaxLength;//队尾指针进1
    return 1;
}

//4、删除一个元素
int deleteFront(SqQueue &Q,Elemtype &e){
    if(Q.front == Q.rear){
        cout<<"队列为空"<<endl;
        return 0;
    }
    e = Q.base[Q.front]; //选取队首元素,用e返回其地址
    cout<<e<<" ";
    Q.front=(Q.front+1)%MaxLength;
    return 1;
}

int main(){
    SqQueue Q;
    init(Q);
    int i,n;
    Elemtype e;
    
    cout<<"请输入队列的元素(小于0则结束):"<<endl;
    while(1){
        cin>>e;
        if(e<0)break;
        cout<<"输入下一个元素:"<<endl;
        insertRear(Q,e);
    }
    
    int len = length(Q);
    cout<<"删除所有元素(列出队列的所有元素)"<<endl;
    for(int i=0;i<len;i++){
        deleteFront(Q,e);
    }
    
    //在执行一次删除,出现异常
    deleteFront(Q,e);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值