球钟问题

#include<stdio.h>
#include<stdlib.h>
#define N 11
#define M 28

typedef int datatype;
typedef struct
{
 datatype data[N];
 int top;
}seqstack;

typedef struct
{
 datatype data[M];
 int front,rear;
}sequeue;

seqstack *Createstack()
{
 seqstack *s;
 s=(seqstack *)malloc(sizeof(seqstack));
 s->top=-1;
 return s;
}

void Pushstack(seqstack *s,datatype  x)

 s->data[++s->top]=x;
}

datatype Popstack(seqstack *s)
{
 return s->data[s->top--];
}

int Emptystack(seqstack *s)
{
 return (s->top==-1);
}

int Fullstack(seqstack *s)

{
 return s->top==(N-1);
}

sequeue *Createqueue()
{
 sequeue *sq;
 sq=(sequeue *)malloc(sizeof(sequeue));
 sq->front=sq->rear=0;
 return sq;
}

void Enqueue(sequeue *sq,datatype x)
{
 sq->rear=(sq->rear+1)%M;
  sq->data[sq->rear]=x;
}

datatype Dequeue(sequeue *sq)
{
 sq->front=(sq->front+1)%M;
 return (sq->data[sq->front]);
}

int Fullqueue(sequeue *sq)
{
 return ((sq->rear+1)%M==sq->front);
}

int flag(sequeue *sq)
{
 datatype x;
 int a=1,i=0;
 for(i=1;i<=27;i++)
 { 
  x=Dequeue(sq);
  a&=(i==x);
  Enqueue(sq,x);
 }
 if(a==1)return 1;
 return 0;
}

int main()
{

 seqstack *sa,*sb,*sc;
 int i=0;
 int n=0;
 datatype x,a;
 sa=Createstack();
 sb=Createstack();
 sc=Createstack(); 
 sequeue *sq;
 sq=Createqueue();
 for(i=1;i<M;i++)
  if( !Fullqueue(sq) )  Enqueue(sq,i);
 while(1)
 {
  x=Dequeue(sq);
  n++;
  if(sa->top==3)
  {
   while(!Emptystack(sa))  Enqueue(sq,Popstack(sa));
   if(Fullstack(sb))
   {
    while(!Emptystack(sb))  Enqueue(sq,Popstack(sb));
    if(Fullstack(sc))
    {
     while(!Emptystack(sc))  Enqueue(sq,Popstack(sc));
     Enqueue(sq,x);
     if(flag(sq)) break;
    }
    else
    {
     Pushstack(sc,x);
    }
   }
   else
   {
    Pushstack(sb,x);   
   }
  }
  else
  {
   Pushstack(sa,x);
  }
 }
 printf("n=%d\n",n);
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值