Files
Linux-C-Notes/C11-数据结构/ds/line/ball_clock/main.c
2024-05-27 02:33:10 +08:00

113 lines
2.2 KiB
C

/**
* @file main.c
* @brief 球钟算法
*
* @author lzy (lllzzzyyy@buaa.edu.cn)
* @url https://lzyyyyyy.fun
*
* @date 2024-04-18
*
*/
#include <stdio.h>
#include <stdlib.h>
#include "queue.h"
#include "sqstack.h"
#define NR_BALL 27
int check(queue *qu)
{
int i = (qu->head + 1) % MAXSIZE;
do
{
if (qu->data[i] > qu->data[(i + 1) / MAXSIZE])
return 0;
i = (i + 1) % MAXSIZE;
} while (i != qu->tail);
return 1;
}
int main( )
{
int i;
queue *qu;
int t, value;
int time;
sqstack *st_min, *st_fivemin, *st_hour;
qu = qu_create( );
if (NULL == qu)
exit(1);
st_min = st_create( );
if (NULL == st_min)
exit(1);
st_fivemin = st_create( );
if (NULL == st_fivemin)
exit(1);
st_hour = st_create( );
if (NULL == st_hour)
exit(1);
for (i = 1; i <= NR_BALL; i++)
qu_enqueue(qu, &i);
qu_travel(qu);
while (1)
{
qu_dequeue(qu, &t);
time++;
if (st_min->top != 3)
{
st_push(st_min, &t);
}
else
{
while (!st_isempty(st_min))
{
st_pop(st_min, &value);
qu_enqueue(qu, &value);
}
if (st_fivemin->top != 10)
st_push(st_fivemin, &t);
else
{
while (!st_isempty(st_fivemin))
{
st_pop(st_fivemin, &value);
qu_enqueue(qu, &value);
}
if (st_hour->top != 10)
st_push(st_hour, &t);
else
{
while (!st_isempty(st_hour))
{
st_pop(st_hour, &value);
qu_enqueue(qu, &value);
}
qu_enqueue(qu, &t);
if (check(qu))
break;
}
}
}
}
printf("time = %d\n", time);
qu_destroy(qu);
st_destroy(st_min);
st_destroy(st_fivemin);
st_destroy(st_hour);
exit(0);
}