作业社区
探索学习新天地,共享知识资源!
学渣小白 的学生作业:
1.1要想表示00:00到12:00最少需要多少个球? 答:最少需要27个球。11+11+4=26即在11:59分时,分钟球4个,五分钟球11个,小时球4个。但是还需要一个球来产生递进,所以最少球:26+1=27。 1.2假设,指示器都为空,球队列需要多长时间能回到原来的状态(即从初始球队列中球的顺序,经过球的循环后球队列中的球再次与初始顺序相同)? #include #include #include #define debug 0 #define DEBUG_PRINT(…) do{ if(debug) printf(VA_ARGS); } while(0) #define N 28 //队列长度为27因为为了区分队空和队满状态,通常会浪费一个存储单元。 typedef int data_t; typedef struct{ data_t buf[N];//定义数组存储数据 int front;//队头元素的下标 int rear;//队尾元素的下标 }loopqueue_t; //节点类型设计 typedef struct node{ data_t data; struct node *next; }linknode_t; //栈头类型设计 typedef struct{ linknode_t *top;//栈顶指针 int n;//记录当前栈中元素个数 }linkstack_t;//1.创建空的循环队列 loopqueue_t * create_empty_loopqueue() { loopqueue_t * queue = (loopqueue_t *)malloc(sizeof(loopqueue_t)); if(queue == NULL) { perror(“malloc is fail!\n”); return NULL; } memset(queue, 0, sizeof(loopqueue_t)); // queue->front = queue->rear=0; return queue; } //2.对空 int is_empty_loopqueue(loopqueue_t *queue) { return queue->front == queue->rear; } //3.队满 int is_full_loopqueue(loopqueue_t *queue) { return (queue->rear+1)%N == queue->front; } //4.入队 void enqueue_loopqueue(loopqueue_t *queue, data_t data) { if(is_full_loopqueue(queue)) { printf(“Queue is full!\n”); exit(-1); } queue->buf[queue->rear] = data; queue->rear = (queue->rear+1)%N; return; } //5.出队 data_t dequeue_loopqueue(loopqueue_t *queue) { if(is_empty_loopqueue(queue)) { printf(“Queue is empty!\n”); exit(-1); } data_t data = queue->buf[queue->front]; queue->front = (queue->front+1)%N; return data; } //1.创建空的链式栈–为栈头在堆区分配空间 linkstack_t *create_empty_stack() { linkstack_t *stack = (linkstack_t *)malloc(sizeof(linkstack_t)); if(stack == NULL) { perror(“malloc is fail!\n”); return NULL; } memset(stack, 0, sizeof(linkstack_t)); return stack; } //2.判断栈是否为空 int is_empty_stack(linkstack_t *stack) { return stack->top == NULL? 1 : 0; } //3.入栈 void push_linkstack(linkstack_t *stack, data_t data) { linknode_t *node = (linknode_t *)malloc(sizeof(linknode_t)); if(node == NULL) { printf(“malloc is fail!\n”); return; } node->data = data; //插入数据,类似链表的头插法 node->next = stack->top; stack->top = node; //更新n的值 stack->n++; return; } //4.出栈 data_t pop_linkstack(linkstack_t *stack) { data_t data;//1.保存要删除节点的数据 linknode_t *temp = stack->top;//2.取出数据 data = temp->data;//3.更新栈顶指针 stack->top = temp->next;//4.释放节点 free(temp);//5.更新n的值 stack->n–; return data; } //5.输出栈顶元素的值 data_t get_top_data(linkstack_t *stack) { return stack->top->data; } //加入小球且判断指示器是否满了 int add_indicator_judge_max(linkstack_t *indicator_t ,int push_num ,int max_ball) { //判断栈是否满了 if(indicator_t->n == max_ball) { DEBUG_PRINT(“Stack is full!\n”); return 1; } push_linkstack(indicator_t,push_num); return 0; } void out_indicator_join_team(linkstack_t *indicator_t,int max_ball,loopqueue_t *queue ) { int count=0; while(!is_empty_stack(indicator_t)) { int temp_ball=pop_linkstack(indicator_t); // DEBUG_PRINT(“Dequeue temp_ball = %d\n”,temp_ball); enqueue_loopqueue(queue,temp_ball); count++; } if(count!=max_ball){ printf(“WARRING:Not enough balls!\n”); printf(“count=%d\n”,count); printf(“max_ball=%d\n”,max_ball); exit(-1); } } int is_initial_state(loopqueue_t *queue) { int num=0; int flag=1; int index=queue->front; data_t data0; do{ data0 = queue->buf[(index++)%N]; if(data0!=num){flag=0;} num++; } while (num< N-1); return flag; } int main(int argc, const char *argv[]){ //DEBUG_PRINT (“Simplified debugging: temp=% d, formula calculation:% d \n”, temp, temp+10); int i=0; int count_min=0; int temp_ball; loopqueue_t *team_column = create_empty_loopqueue(); linkstack_t *minute_indicator=create_empty_stack(); linkstack_t *five_minute_indicator=create_empty_stack(); linkstack_t *hour_indicator=create_empty_stack(); //初始化先将0-26即27个数字球入队列 while(!is_full_loopqueue(team_column)) { enqueue_loopqueue(team_column,i++); } // while(!is_empty_loopqueue(team_column)) // { // printf(“Team data = %d\n”,dequeue_loopqueue(team_column)); // } while(1) { count_min++; temp_ball=dequeue_loopqueue(team_column); if (count_min%60==0){DEBUG_PRINT ("count_min=%d\n",count_min);} // DEBUG_PRINT(“Dequeue temp_ball = %d\n”,temp_ball); //判断个数字球 if (add_indicator_judge_max(minute_indicator,temp_ball,4)){ DEBUG_PRINT(“minute_indicator is full!\n”); out_indicator_join_team(minute_indicator,4,team_column); //此时temp还没有入栈 if(add_indicator_judge_max(five_minute_indicator,temp_ball,11)){ out_indicator_join_team(five_minute_indicator,11,team_column); DEBUG_PRINT(“five_minute_indicator is full!\n”); // break; if(add_indicator_judge_max(hour_indicator,temp_ball,11)){ out_indicator_join_team(hour_indicator,11,team_column); DEBUG_PRINT(“The team is full!\n”); //恢复队列 enqueue_loopqueue(team_column,temp_ball); } } } if(is_initial_state(team_column)){ DEBUG_PRINT("IS INITIAL STATE!\n"); break; } } DEBUG_PRINT("\n--------------talisman-----------\n"); DEBUG_PRINT("minute_indicator is full!\n"); DEBUG_PRINT ("count_min=%d\n",count_min); printf("The final required number of minutes is" "\n"); printf("%d\n",count_min); printf("The final required number of hours is" "\n"); printf("%d\n",count_min/60); printf("The final required number of days is" "\n"); printf("%d\n",count_min/60/24); // while(!is_empty_loopqueue(team_column)) // { // DEBUG_PRINT(“Team data = %d\n”,dequeue_loopqueue(team_column)); // } return 0; } The final required number of minutes is 33120 The final required number of hours is 552 The final required number of days is 23