参照书上及网上大神的算法思想所写代码
1.顺序队列:顺序队列的基本实现是顺序表,出队后再进队时会出现“假溢出”现象,所以用循环队列来实现,其核心步骤为:r = (r+1)%msize;(用于进队)和 f = (f+1)%msize;(用于出队)
具体的各个功能的实现类似于顺序栈的实现,顺序栈的实现
直接上完整代码
#include <stdio.h>
#include <stdlib.h>
typedef struct Queue{
int f;
int r;
int msize;
int *elem;//基指针
}Queue;
void Init(Queue *q,int msize){//初始化队列
q->r = 0;
q->f = 0;
q->msize = msize;
q->elem = (Queue*)malloc(q->msize * sizeof(Queue));
}
int isEmpty(Queue *q){//判空
if(q->r == q->f)
return 1;
return 0;
}
void destory(Queue *q){//销毁
q->f = -1;
q->r = -1;
q->msize = -1;
free(q->elem);
}
//进队
void EnQueue(Queue *q,int x){
if((q->r + 1)%q->msize == q->f)
return;
q->r = (q->r+1)%q->msize;
q->elem[q->r] = x;
}
void DeQueue(Queue *q){//出队
if(isEmpty(q))
return;
q->f = (q->f + 1)%q->msize;
}
int getTop(Queue *q){//获得队头顶元素
if(!isEmpty(q))
return q->elem[(q->f+1)%q->msize];
}
int main(int argc, char *argv[]) {
Queue *q;
Init(q,10);
int i;
for(i = 0; i < 7; i++){
EnQueue(q,i);
}
printf("%d\n",getTop(q));
DeQueue(q);
printf("%d\n",getTop(q));
EnQueue(q,9);
printf("%d",q->elem[q->r]);
}
2.链队列:主要是通过移动对头指针和队尾指针来进行进队的操作,当对头指针和队尾指针同时指向头结点时,队列为空,其余各个功能的实现和单链表相似单链表的常用操作
完整代码如下
#include <stdio.h>
#include <stdlib.h>
typedef struct Noded{
struct Noded *next;
int data;
}Noded;
typedef struct{
struct Noded *f;//头指针
struct Noded *r;//尾指针
}link;
//对头指针和队尾指针都指向头结点时队列为空
void Init(link *link){//初始化
Noded *p = (Noded *)malloc(sizeof(Noded));
if(!p)
return;
link->f = p;
link->r = p;
link->r->next = NULL;//link->r->next始终不变
}
void EnQueue(link *link,int x){//进队
Noded *p = (Noded*)malloc(sizeof(Noded));
p->data = x;
p->next = NULL;
link->r->next = p;
link->r = p;
}
void DeQueue(link *link){//出队
Noded *p = link->f;
link->f = link->f->next;
free(p);
}
void print(link *l){//打印
Noded *p = l->f->next;
while(p!=NULL){
printf("%d ",p->data);
p = p->next;
}
}
int main(){
link *link;
Init(link);
int i;
for(i = 0; i < 7; i++){
EnQueue(link,i);
}
print(link);
printf("\n");
DeQueue(link);
print(link);
}