队列的实现

=========================================================================================================================

//用链表实现队列

 

#include<stdio.h>

#include<assert.h>

#include<strings.h>

#include<stdlib.h>

 

#define QUEUE_TYPE int

typedef struct person{

int num;

struct person *next;

}PER;

 

void creat(void);//我们初始化,用malloc分配给tail指向一个空的结构体,目的是用于结束的判断

void destory(void);//释放creat给tail分配的空间

void insert(QUEUE_TYPE value);//入队

QUEUE_TYPE frist(void);     //遍历队头元素,并不对他进行操做

void delete(void);//出队

int is_empty(void);//判断是否是空队

 

static PER *head=NULL;

static PER *tail=NULL;

static PER *tail_pre=NULL;//用来指向倒数第二个结点,真正有数据的结点

 

int main(){

int i,j=1,k;

creat();

printf("请输入入队的个数:\n");

scanf("%d",&i);

while(i){

printf("请输入第%d个数为:\n",j++);

scanf("%d",&k);

insert(k);

i--;

}

/*

for(i=1;i<=10;i++){

insert(i);

}

*/

printf("出队内容为:\n");

while(!is_empty()){

printf("%d\t",frist());

delete();

}

destory();

return 0;

}

 

void destory(void){

free(tail);

}

void creat(void){

tail=(PER *)malloc(sizeof(PER));

   Assert(tail != NULL);//断言分配内存成功

bzero(tail,sizeof(PER));

tail->next = NULL;

}

void insert(QUEUE_TYPE value){

PER *tmp=NULL;

tmp = (PER *)malloc(sizeof(PER));

   Assert(tmp != NULL);

bzero(tmp,sizeof(PER));

tmp->num = value;

if(head==NULL){

head = tail_pre = tmp;

}else{

tail_pre->next = tmp;

tail_pre = tail_pre->next;//tail_pre使终指向最后一个装有有效数据的结点

}

tail_pre->next = tail; //把最后一个元素与次最后元素边起来

}

QUEUE_TYPE frist(void){

assert(!is_empty());

return head->num;

}

void delete(void){

assert(!is_empty());

PER *tmp = head;

head = head->next;

free(tmp);

}

int is_empty(void){

return head == tail;

}

================================================================================================================================

//用数组实现队列

 

#include<stdio.h>

#include<assert.h>

#include<strings.h>

#include<stdlib.h>

 

//用宏代替一些与队列有关系的参数,容易实现整体的改动

#define QUEUE_TYPE int //定义队列中存放值的类型

#define QUEUE_SIZE 30 //队列的大小

#define ARRAY_SIZE (QUEUE_SIZE+1) //数组中有效值为队列大小减一,有一个不用,用来标识满或空

 

//定义全局变量

static QUEUE_TYPE  queue[ ARRAY_SIZE ];   //定义全局数组

static size_t front=1; //队头的下标

static size_t rear=0; //队尾的下标

 

//声明子函数

void insert(QUEUE_TYPE value);//入队

QUEUE_TYPE frist(void);     //遍历队头元素,并不对他进行操做

void delete(void);//出队

int is_empty(void);//判断是否是空队

int is_full(void);//判断队是否满了?

 

 

int main(){

int i;

for(i=1;i<=10;i++){

insert(i);

}

 

printf("出队内容为:\n");

while(!is_empty()){

printf("%d\t",frist());

delete();

}

return 0;

}

 

 

void insert(QUEUE_TYPE value){

assert(!is_full());

rear = (rear+1)%ARRAY_SIZE;

queue[rear] = value; //rear队尾的下标

}

QUEUE_TYPE frist(void){

assert(!is_empty());

return queue[front];  //front 代表队头的下标

}

void delete(void){

assert(!is_empty());

front=(front+1)%ARRAY_SIZE;

}

 

int is_empty(void){

return (rear+1)%QUEUE_SIZE==front;//画画图就清楚了

}

int is_full(void){

return (rear+2)%QUEUE_SIZE==front;//这个也是!

}

==============================================================================================================================

//用sum来代表队列中剩余的数据元素,当sum等于0时,这个队列就为空了;当sum等于N时就表示队列满了。

#include <stdio.h>

 

#define N 6

 

 int f=0,r=0;

         int a[N];

 int sum=0;

void indui(int num)

{

r=r%N;

if(sum<N )

  {

a[r]=num;

sum++;

r++;

  }

else 

                {printf("dui man \n");}

}

int outdui(void)

{ int out;

if(sum==0)

{

printf("dui NULL\n");

}

else

{

f=f%N;

sum--;

out=a[f];

f++;

}

return out;

}

 

int main()

{

int i;

indui(1);

indui(2);

indui(3);

indui(4);

outdui();

indui(5);

indui(6);

outdui();

indui(7);

for(i=0;sum!=0;i++)

printf("%d\t",outdui());

printf("\n");

return 0;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值