软考:数据结构基础——循环队列C语言实现

 
循环队列得实现:
1.
    在入队和出队时,我们通过 
    q->rear = (q->rear +1)%MAX_LENTH 来实现循环入队
    q->front = (q->front +1)%MAX_LENTH 来实现循环出队
    
2.
箭头方向为队列的方向
当 front 的下标在 rear 之前时 我们通过 
(q->front < q->rear)
 && 
(q->rear + q->front +1)%MAX_LENTH == 0
来判断队列是否为满
 
3.
箭头方向为队列方向(红色为起点)
当 rear 的下标在 front 之前时 即 rear 从线性表的最后一个元素指向第一个元素时
我们通过
q->front > q->rear 
&& 
(q->front - q->rear + 1)%MAX_LENTH == 0
来判断队列是否为满
 
 
#include <stdio.h>
#include <stdlib.h>
 
#define MAX_LENTH 10
#define BOOL int
 
typedef struct queue{
    int *base;
    int rear;
    int front;
}Queue;
 
void Init(Queue *q){
    q->base = (int *)malloc(sizeof(int)*MAX_LENTH);
    q->front = 0;
    q->rear = 0;
}
 
void Insert(int data, Queue *q){
    BOOL flag;
    if((q->front < q->rear) && (q->rear + q->front +1)%MAX_LENTH == 0)    //当rear在 front 之后时判断队列是否为满
    {
        flag = 1;
    }/* if */
    else if (q->front > q->rear && (q->front - q->rear + 1)%MAX_LENTH == 0){  //当 front 在 rear 之前时判断队列是否为满
        flag = 1;
    }/* else if */
    else{
        flag = 0;
    }/* else */
 
    if(flag){
        printf("栈已满 \n");
    }else{
        q->base[q->rear ++] = data;
    }
}/* Insert() */
 
int Quit(Queue *q){
    if(q->rear == q->front){
        printf("空队列");
        return ;
    }/* if */
    else{
        return q->base[q->front++];
    }/* els e*/
}/* Quit() */
 
int The
 
int main(){
    Queue q;
    int i;
    Init(&q);
    for(i=0; i<11 ;i++){
        printf("insert %d \n",i);
        Insert(i,&q);
    }
    for(i=0;i<11;i++){
        printf("%d\n",Quit(&q));
    }
    return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/dyf-stu/p/10051239.html