队列c语言

**1.循环队列
循环队列的定义

struct Queue{
    int maxSize;    //  队列最大长度
    int *data;      //  数据指针
    int front;      //  头指针索引
    int rear;       //  尾指针索引
};

a判断队列que是否为空//若空返回 true 并在一行打印 The queue is Empty 末尾换行!!!// 否则返回 false
思路:循环队列头指针和尾指针相等则队列为空

bool isEmpty(Queque* que)
{
if(que->rear==que->front)
{printf("The queue is Empty\n");
return true;}
else return false;
}

b实现入队操作:将元素item加入队列que尾部// 若队列没满,编写加入操作,返回 1// 若队列满了,不做任何操作,返回 -1
思路:注意循环队列入队后尾指针索引为[que->rear+1]%que->maxSize(余数在循环队列应用)

bool isFull(Queque* que)
{
if((que->rear+1)%que->maxSize==que->front)
{
printf(The queue is Full\n");
        return true;
}
else return false;
}
int enQueque(Queque* que,int item)
{
if(isFull(que)==true)return-1;
else{
que->data[que->rear]=item;
que->rear=(que->rear+1)%que->maxSize;
return 1;}
}

c实现出队操作移除队列que首部元素,并返回元素值
思路:建立节点,与入队是一个相对应的过程

int deQueue(Queue* que)
{
if(isEmpty(que)==true)return -1;
else{int x;
x=que->data[que->front];
que->front=(que->front+1)%que->maxSize;
return x;}
}

2.链队列
链队列动态创建节点,不需要预设大小,内存空间不需要连续,入队、出队更容易实现。但是存取速度慢,操作也比数组的方式更加复杂。
struct Node // 数据节点
{
int data; // 数据类型
Node *next; // 指向下一个节点的指针
};
struct LinkQueue // 链表队列
{
Node *front; // 头指针
Node *rear; // 尾指针
};
实现入队操作:将元素item加入队列que尾部
思路:建立节点–新节点赋值给指向尾指针下一节点–尾指针指向新节点

bool isEmpty(LinkQueue* que)
{
if(que->front==que->rear)
     {
         printf("The queue is Empty\n");
         return true;
     }                                                           
    else return false;
}
void enQueue(LinkQueue* que,int item)
{
Node* node=(Node*)malloc(sizeof(Node));
node->data=item;
node->next=NULL;
que->rear->next=node;
que->rear=node;
}

实现出队操作:移除队列que首部元素,并返回元素值
//注意:出队是首元素

int deQueue(LinkQueue* que)
{
Node* node=(Node*)malloc(sizeof(Node));
node=que->front->next;
que->front=que->front->next;
return node->data;
}

3.单链表循环队列**
struct Node // 数据节点
{
int data; // 数据类型
Node *next; // 指向下一个节点的指针
};
struct CycleQueue // 循环链表队列
{
int size_; // 目前队列元素个数
Node *rear; // 尾指针
};
实现入队操作:将元素item加入队列que尾部
实现出队操作:移除队列que首部元素,并返回元素值
//思路:建立节点–插入(三步:节点指针域,尾节点指针域,尾节点)–尾指针指向新节点
建立节点–尾指针指向下一节点,头指针即que->rear->next
node=que->rear->next;
que->rear->next=node->next;

bool isEmpty(Cycleque* que)
{
if(que->size_==0)
    {
        printf("The queue is Empty\n");
        return 1;
    }
    else return 0;

}
void enQueue(CycleQueue* que, int item)
{
Node* node;
    node=(Node*)malloc(sizeof(Node));
    node->data=item;
    if(que->size_==0)
    {
     que->rear=node;
     que->rear->next=node;
    }
    else{
node->next=que->rear->next;
que->rear->next=node;
que->rear=node;}
que->size_+=1;

}
int deQueue(CycleQueue* que)
{
if(isEmpty(que))return 0;
    else{Node* node;
    node=(Node*)malloc(sizeof(Node));
    int a;
        node=que->rear->next;
    a=node->data;
      que->rear->next=node->next;
      que->size_-=1;
    return a;}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尾迹双冒号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值