手工数据结构系列-C语言模拟队列 hdu1276

#include <stdio.h>
#include <stdlib.h>
#define init_size 1000
typedef struct {
    int head,tail,size,__size,*seq;
}Queue;
typedef Queue* Q_P;
void init(Q_P q){
    q->head=q->tail=0;q->__size=init_size;q->size=0;
    q->seq=(int*)malloc(init_size*sizeof(Queue));
}
void push(Q_P q,int ele){
    if(q->tail+1>=q->__size){
        q->seq=(int*)realloc(q->seq,sizeof(int)*(q->__size*=2));
    }
    q->seq[q->tail++]=ele;
    q->size++;
    //debug
    // printf("PUSH %d SIZE:%d\n",q->seq[q->tail-1],q->size);
}
int empty(Q_P q){
    if(q->head==q->tail) return 1;
    return 0;
}
void pop(Q_P q){
    if(!empty(q)) q->head++,q->size--;
    // printf("POP SIZE:%d\n",q->size);
}
int front(Q_P q){
    if(!empty(q)) return q->seq[q->head];
}
void print(Q_P q){
    printf("%d",front(q));pop(q);
    while(q->size!=0) {printf(" %d",front(q));pop(q);}
    printf("\n");
}
void test(){
    int i;
    Q_P q=(Q_P)malloc(sizeof(Queue));
    init(q);
    for(i=0;i<10;++i) {push(q,i);}
    print(q);
}
void solve(){
    int n,i,T;scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        Q_P a=(Q_P)malloc(sizeof(Queue)),b=(Q_P)malloc(sizeof(Queue));//或者Queue *a,*b;
        init(a);init(b);
        for(i=1;i<=n;++i){
                push(a,i);push(b,i);
        }
        // print(a);print(b);
        //print the Queue ,but at the same time the action does clear the queue
        if(a->size!=0&&a->size<=3) print(a);
        int cnt=0;
        while(a->size>3||b->size>3){
            int k;
            for(k=2;k<=3;++k){
                cnt++;
                if(cnt&1){
                    while(b->size!=0) pop(b);
                    int cc=0;while(a->size!=0) {if(++cc%k!=0) push(b,front(a));pop(a);}
                }
                else{
                    while(a->size!=0) pop(a);
                    int cc=0;while(b->size!=0) {if(++cc%k!=0) push(a,front(b));pop(b);}
                }
                if(a->size!=0&&a->size<=3) {print(a);break;}
                if(b->size!=0&&b->size<=3) {print(b);break;}
            }
        }
    }
}

int main(){
    // test();
    solve();
    return 0;
}
时间: 2024-08-07 07:48:13

手工数据结构系列-C语言模拟队列 hdu1276的相关文章

数据结构实践——排队看病模拟(队列)

本文是针对数据结构基础系列网络课程(3):栈和队列的实践项目. [项目 - 排队看病模拟] 编写一个程序,反映病人到医院看病,排队看医生的情况.在病人排队过程中,主要重复两件事: (1)病人到达诊室,将病历本交给护士,排到等待队列中候诊. (2)护士从等待队列中取出下一位病人的病历,该病人进入诊室就诊. 要求模拟病人等待就诊这一过程.程序采用菜单方式,其选项及功能说明如下: (1)排队--输入排队病人的病历号,加入到病人排队队列中. (2)就诊--病人排队队列中最前面的病人就诊,并将其从队列中删

数据结构之---C语言实现队列的顺序存储

//C语言串的顺序存储表示 //串的堆分配存储表示 //杨鑫 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSTRLEN 255 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 //定义数据元素结的构 typedef int

Javascript与数据结构系列(二)——队列的实现

队列实现 使用数组来实现队列看起来顺理成章.JavaScript 中的数组具有其他编程语言中没有的优点, 数组的 push() 方法可以在数组末尾加入元素,shift() 方法则可删除数组的第一个元素. push() 方法将它的参数插入数组中第一个开放的位置,该位置总在数组的末尾,即使是个 空数组也是如此.请看下面的例子: names = []; name.push("Cynthia"); names.push("Jennifer"); print(names);

数据结构之C语言模拟整数数组实现

#include <stdio.h> #include <malloc.h> #include <stdlib.h> typedef struct Arr { int *pBase; //数组第一个元素地址 int len; //数组长度 int cnt; //当前有效元素数量 } Array; void init_array(Array *, int); //初始化数组 void show_array(Array *); //遍历打印数组 bool is_empty(

数据结构算法C语言实现(十二)--- 3.4循环队列&amp;队列的顺序表示和实现

一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 1 //3_4_part1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-9 6 note:realize my textbook <<数据结构(C语言版)>> 7 */ 8 //Page 64 9 #include <cstdio

数据结构算法C语言实现(十一)--- 3.4队列的链式表示和实现

一.简介 FIFO. 二.头文件 1 //3_4_part1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-9 6 note:realize my textbook <<数据结构(C语言版)>> 7 */ 8 //Page 61 9 #include <cstdio> 10 #include "head.h" 11 #define QElemType int 12 //

剑指offer系列5---两个栈 模拟队列的操作

[题目]两个栈 模拟队列的入队出队操作 1 package com.exe1.offer; 2 3 /** 4 * [题目 ]:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 5 * 队列的出队:应该是队列的列首先出,即栈底元素先出:思路:先把stack1元素一个个弹至上stack2中,再顺序出stack2中数即为队列的出队顺序. 6 * 入队:先放到栈1中 7 * @author WGS 8 * 9 */ 10 import java.util.Stack

模拟队列 数据结构 SzNOI c004

昨天苏州oj爆掉了,就没发,今天补上,利用的是循环队列来做的 内容: [问题描述] 请设计一个程序模拟队列,具备初始队列.入队.出队.输出队列数据的功能. [输入] 输入由若干行组成,每行表示一种操作.每行由一个或两个整数组成,其中第一个整数代表操作的类型:1表示初始队列操作,2表示入队操作,3表示出队操作.4表示输出队列信息,第二个整数表示操作所涉及的数据. 初始队列操作:将队列置为空并重新设置队列容量.该行第二个整数设为队列的容量. 入队操作:将该行第二个整数入队,如队列中元素个数超过队列容

西风的数据结构教程(2)——队列

队列是一种简单的先进先出结构,各种需要排队的事情,都可以开一个队列来完成. 利用链表或数组,都能实现队列,不过最大的区别就是,数组的扩展比较困难,而链表较为容易,但链表资源消耗稍多. 数据结构的不同导致了队列的实现也不相同,链表上次已经实现过了,只需简单包装即可使用,这里,我们介绍简单的用数组模拟队列的方式: 这个队列是固定长度的一个数组构建的,另外保存两个int数字,负责记录数组的下标索引. 我们下面就来编写一下这个队列,还是使用C语言,在此,我会继续介绍C语言的基础知识. 队列实现 复习一下