队列c语言"/>
队列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;}}
更多推荐
队列c语言
发布评论