2023-04-01-循环队列CycleSqQueue的基本操作

//循环链表
//牺牲一个单元来区分队空还是队满
#include <stdio.h>
#include <stdbool.h>

#define MAXSIZE 6

typedef struct
{
    int data[MAXSIZE];
    int front,rear;
}CySqQueue;

void initCySqQueue(CySqQueue *C)//初始化循环链表
{
    C->front=0;
    C->rear=0;
}

bool isEmpty(CySqQueue C)//判断是否为空
{
    if(C.front==C.rear)
    {
        return true;
    }
    else
    {
        return false;
    }
}

bool EnCyQueue(CySqQueue *C,int e)//!!入队
{
    if((C->rear+1)%MAXSIZE==C->front)//重点,判断队是否已满
    {
        return false;
    }
    else
    {
        C->data[C->rear]=e;
        C->rear=((C->rear)+1)%MAXSIZE;//通过此条语句来实现循环队列
        return true;
    }
}

bool DeCyQueue(CySqQueue *C,int *e)//出队操作
{
    if(isEmpty(*C))//判断队是否为空
    {
        return false;
    }
    else
    {
        *e=C->data[C->front];
        C->front=(C->front+1)%MAXSIZE;//!!重点,不要忘记对MAXSIZE求余
        return true;
    }
}

int main()
{
    CySqQueue C;
    initCySqQueue(&C);
    int x;
    for(int i =0;i<MAXSIZE-1;i++)
    {
        scanf("%d",&x);
        EnCyQueue(&C,x);
    }
    printf("C.front: %d C.rear: %d\n",C.front,C.rear);
    printf("front_value: %d rear_value: %d\n",C.data[C.front],C.data[C.rear-1]);//rear当前所指的是牺牲区,所以rear-1才是最后一个元素

    int *e;
    int a=0;
    e=&a;

    DeCyQueue(&C,e);
    printf("out_value: %d C.front: %d\n",*e,C.front);
    EnCyQueue(&C,888);
    printf("%d %d",C.rear,C.data[5]);//?,不能用rear-1来获取最后一个元素,因为当rear等于0时,rear-1为-1不存在
    return 0;
}
 

C++:

//循环链表
//牺牲一个单元来区分队空还是队满
#include <stdio.h>
#include <stdbool.h>

#define MAXSIZE 6

typedef struct
{
    int data[MAXSIZE];
    int front,rear;
}CySqQueue;

void initCySqQueue(CySqQueue &C)//初始化循环链表
{
    C.front=0;
    C.rear=0;
}

bool isEmpty(CySqQueue C)//判断是否为空
{
    if(C.front==C.rear)
    {
        return true;
    }
    else
    {
        return false;
    }
}

bool EnCyQueue(CySqQueue &C,int e)//!!入队
{
    if((C.rear+1)%MAXSIZE==C.front)//重点,判断队是否已满
    {
        return false;
    }
    else
    {
        C.data[C.rear]=e;
        C.rear=((C.rear)+1)%MAXSIZE;//通过此条语句来实现循环队列
        return true;
    }
}

bool DeCyQueue(CySqQueue &C,int *e)//出队操作
{
    if(isEmpty(C))//判断队是否为空
    {
        return false;
    }
    else
    {
        *e=C.data[C.front];
        C.front=(C.front+1)%MAXSIZE;//!!重点,不要忘记对MAXSIZE求余
        return true;
    }
}

int main()
{
    CySqQueue C;
    initCySqQueue(C);
    int x;
    for(int i =0;i<MAXSIZE-1;i++)
    {
        scanf("%d",&x);
        EnCyQueue(C,x);
    }
    printf("C.front: %d C.rear: %d\n",C.front,C.rear);
    printf("front_value: %d rear_value: %d\n",C.data[C.front],C.data[C.rear-1]);//rear当前所指的是牺牲区,所以rear-1才是最后一个元素

    int *e;
    int a=0;
    e=&a;

    DeCyQueue(C,e);
    printf("out_value: %d C.front: %d\n",*e,C.front);
    EnCyQueue(C,888);
    printf("%d %d",C.rear,C.data[5]);//?,不能用rear-1来获取最后一个元素,因为当rear等于0时,rear-1为-1不存在
    return 0;
}

 

posted @ 2023-04-01 09:34  正方形的被子  阅读(50)  评论(0)    收藏  举报