您的位置:首页 > 其它

杭电ACM 1276 士兵队列训练

2013-08-13 20:48 169 查看
#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#include<malloc.h>

//定义队列结构体:

typedef struct str

{

 int capacity;  //定义队列的容量

 int size;    //定义队列的长度

 int head;    //定义队列的头

 int tail;    //定义队列的尾

 int *array;   //定义队列数组,存放队列的数据

} queue;//typedef函数,用queue 代替struct str

//定义此函数使每次队列用过之后可以重新赋0

void fqueue(queue *p)

{

 p->tail=0;

 p->head=0;

 p->size=0;

}

//定义此函数使函数使用之前赋值0,并确定队列的最大容量

void gqueue(queue *p,int n)

{

 p->capacity=n;

 p->tail=0;

 p->head=0;

 p->size=0;

 p->array=(int *)malloc(sizeof(queue)*n);//注意给数组分配空间

}

//向队列中输入数据,进栈

int getqueue(queue *p,int num)

{

 p->array[p->tail]=num;

 p->tail++;

 p->size++;

 return 0;

}

//从队列中输出数据,出栈

int outqueue(queue *p)

{

 int num;

 num=p->array[p->head];

 p->array[p->head]=0;

 p->head++;

 p->size++;

 return num;//注意此处是return num;

}

//释放空间

void freequeue(queue *p)

{

 free(p);

}

//主函数部分

int main()

{

 int cases,i,a,num;

 queue *p1=NULL,*p2=NULL,*ans=NULL;//定义三个队列,ans用来存放要输出队列的值

// p1=NULL;

// p2=NULL;    (这样赋值也可以)

// ans=NULL;

 scanf("%d",&cases);

 while(cases--){

  scanf("%d",&a);

 // gqueue(p1,a);  这两句放在此处不正确,因为要先给p1,p2分配空间才可以确定其最大容量

 // gqueue(p2,a);

     p1=(queue *)malloc(sizeof(queue));

        p2=(queue *)malloc(sizeof(queue)); //分配空间是注意p1,p2是queue类型的

  gqueue(p1,a);

  gqueue(p2,a);

  for(i=1;i<=a;i++)

  getqueue(p1,i);

  ans=p1;

  while(p1->size>3){  //总循环条件

   fqueue(p2);

            while(p1->head!=p1->tail){  //当队列不为空时进行循环

              num=outqueue(p1);

   if((p1->head)%2!=0)

    getqueue(p2,num);

  }

   if(p2->size<=3){  //注意每次交换队列中的数据后要判断是否<=3

   ans=p2;

   break;

  }

  

     fqueue(p1);

     while(p2->head!=p2->tail){   //当队列不为空时进行循环

             num=outqueue(p2);

      if((p2->head)%3!=0)

     getqueue(p1,num);

     }

     if(p1->size<=3){  //注意每次交换队列中的数据后要判断是否<=3

      ans=p1;

      break;

     }

  }

  //输出数据

     for(i=ans->head;i<ans->tail-1;i++)

      printf("%d ",ans->array[i]);

     printf("%d\n",ans->array[i]);

   freequeue(p1);

   freequeue(p2);

 }

 return 0;

}

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: