顺序队列的基本操作

#define maxsize 10
typedef struct{
    elemtype data[maxsize];
    int front,rear;  //对头指针和队尾指针 
}sqQueue;
//初始化
void InitQueue(sqQueue &Q){
    Q.rear=Q.front=0;
} 
//判空 
bool QueueEmpty(sqQueue Q){
    if(Q.rear==Q.front) return true;
    else
    return false;
}
//入队
bool EnQueue(sqQueue &Q,int x){
    if(满) return false;//队尾指针的再下一个位置是对头 即(Q.rear+1)%maxsize==Q.front 
    Q.data[Q.rear]=x;
    Q.rear=(Q.rear+1)%maxsize;
    return true;
} 
//出队
bool DeQueue(sqQueue &Q,int &x){
    if(Q.rear==Q.front) return false; //判空
    x=Q.data[Q.front];
    Q.front=(Q.front+1)%maxsize;//后移 
    return true;
} 
//获取队头元素的值
bool GetHead(sqQueue Q,int x){
    if(Q.rear==Q.front) return false;
    x=Q.data[Q.front];
    return true;
} 

//此时的rear都是指向队尾元素的后一个位置即下一个即将插入的位置
方案一:
//
队列元素个数 (rear+maxsize-front)%maxsize
队列已满条件:队尾指针的再下一个位置是队头,即 (Q.rear+1)%Maxsize=Q.front
此时会浪费一个存储单元
方案二:
在结构体中定义int size=0,//队列当前长度 每次插入成功size++ 删除成功size--, 队满时size=maxsize 方案三:
定义int tag;//最近进行的是插入or删除 tag=0最近进行删除操作,=1为插入, 只有删除操作才可能导致队空,只有插入操作才可能导致队满 队满时 front==rear&&tag=1
队空 front==rear&&tag=0
//若rear指向队尾元素 则
入队操作:Q.rear=(Q.rear+1)%Maxsize;Q.data[Q.rear]=x 先将rear指针后移再插入
初始化: front=0;rear=n-1
判空:(Q.rear+1)%Maxsize=Q.front (队尾指针的下一个位置是不是队头)

 

posted @ 2020-05-01 22:33  iiiiiki  阅读(734)  评论(0)    收藏  举报