队列板子

队列

队列:先进先出的线性表

顺序队列

队列有队头的front指针和队尾的rear指针。顺序队列的出队是通过移动first指针进行操作的“假删除”。

普通顺序队列

//顺序普通队列板子
#define MAX 10
typedef struct{
    int data[MAX];
    int front;
    int rear;
}queque;
void init(queque* a){//初始化队列
    a->front=a->rear=-1;
}
int add(queque* a,int num){//新元素入队
    if(a->rear==MAX-1) return 1;
    else{
        a->rear++;
        a->data[a->rear]=num;
        return 0;
    }
}
int delete(queque* a){//元素出队,注意顺序队列中只是通过移动队头指针实现的“假删除”
    if(a->front==a->rear) return 1;
    else{
        a->front++;
        return 0;
    }
}
int gethead(queque* a){
    if(a->front==a->rear) return 1;
    else return a->data[a->front];
}
int getlast(queque* a){
    if(a->front==a->rear) return 1;
    else return a->data[a->rear];
}
int length(queque* a){
    return a->rear-a->front;
}
int checkempty(queque* a){
    if(a->front==a->rear) return 0;
    else return 1;
}
int checkfull(queque* a){//注意会出现假上溢情况
    if(a->rear==MAX-1) return 0;
    else return 1;
}

循环顺序队列

为避免出现假上溢情况,一般采取循环顺序队列。尾指针通过取模运算自动控制其所在下标。(实现:[(rear+1)%maxsize])

浪费数组内一个空间的情况
#define MAX 10
typedef struct{
    int data[MAX];
    int front,rear;
}queue;
void inti(queue* a){
    a->front=a->rear=MAX-1;//模拟普通顺序队列的front指向队头元素的前一个元素 从而完成浪费一个数组空间的操作
}
int add(queue* a,int num){
    if((a->rear+1)%MAX==a->front) return 1;
    else{
        a->rear=(a->rear+1)%MAX;//浪费一个空间的方式
        a->data[a->rear]=num;
        return 0;
    }
}
int delete(queue* a){
    if(a->front==a->rear) return 1;
    else{
        a->front=(a->front+1)%MAX;
        return 0;
    }
}
int length(queue* a){
    return (a->rear-a->front+MAX)%MAX;//此处取模的方式非常巧妙。注意front为指向队头的前一个元素
}
int gethead(queue* a){
    if(a->rear==a->front) return 1;
    else return a->data[(a->front+1)%MAX];
}
int getrear(queue* a){
    if(a->rear==a->front) return 1;
    else return a->data[(a->rear+1)%MAX];
}
int checkempty(queue* a){
    if(a->rear==a->front) return 0;
    else return 1;
}
int checkfull(queue* a){
    if((a->rear+1)%MAX==a->front) return 0;
    else return 1;
}

一般都是采取浪费一个空间的情况,如不想浪费数组内一个空间,需要先将元素入队,再加判断的情况下移动指针。

扩展:双端队列

允许在队列两端(前端和后端)进行入队和出队操作。后端进前端出/前端进后端出——队列,前端进前端出/后端进后端出——栈。

链式队列

本质:带头指针和尾指针的单链表,尾插法入队,删除首元结点出队。在内存条允许范围内不会出现假上溢的情况。

C++ STL库

队列板子_第1张图片

你可能感兴趣的:(板子,学习心得,c++,c语言,数据结构,算法,青少年编程)