은근한

실력키우기 - 자료처리 [Queue] 본문

ALGORITHM/Data Structure

실력키우기 - 자료처리 [Queue]

EsJoo 2016. 1. 18. 03:15

큐?

큐(queue)는 컴퓨터의 기본적인 자료 구조의 한가지로, 

먼저 집어 넣은 데이터가 먼저 나오는 FIFO (First In First Out)구조로 저장하는 형식을 말한다. 

영어 단어 queue는 표를 사러 일렬로 늘어선 사람들로 이루어진 줄을 말하기도 하며,

먼저 줄을 선 사람이 먼저 나갈 수 있는 상황을 연상하면 된다.

나중에 집어 넣은 데이터가 먼저 나오는 스택과는 반대되는 개념이다.







#include <stdio.h>
#include <stdlib.h>
 
 
typedef struct _node{
    int data;
    struct _node *next;
}node;
 
typedef node* nptr;
 
typedef struct _queue{
    int count;
    nptr front;
    nptr rear;
}queue;
 
queue* create_queue();
void add_queue(queue *qptr,int data);
int rm_queue(queue *qptr);
int get_count_queue(queue *qptr);
void print(int *res, int index);
 
int main(int argc, char** argv){
    
    int n;
    char select;
    int data;
    int index =0;
    int* res;
    queue* q;
    q = create_queue();
    scanf("%d",&n);
    if (n>100) {
        return -1;
    }
    res = (int *)malloc(sizeof(int *)*n);
    
    while (n>=1&&n<=100) {
        scanf("%c",&select);
        if (select=='i'){
            scanf("%d",&data);
            if (data >10000) {
                return -1;
            }
            add_queue(q, data);
            n--;
        } else if (select=='c'){
            res[index] = get_count_queue(q);
            index = index+1;
            n--;
        } else if (select=='o'){
            res[index] = rm_queue(q);
            index = index+1;
            n--;
        }
        
    }
    
    print(res, index);    
    
    return 0;
}
 
queue* create_queue(){
    queue* new_queue = (queue*)malloc(sizeof(queue));
    new_queue->count=0;
    new_queue->front=NULL;
    new_queue->rear=NULL;
    
    return new_queue;
}
void add_queue(queue *qptr,int data){
    nptr new_node = (nptr)malloc(sizeof(nptr));
    new_node->data = data;
    new_node->next = NULL;
    
    if (qptr->count==0){
        qptr->front = new_node;
        qptr->rear = new_node;
    } else {
        qptr->rear->next = new_node;
        qptr->rear = new_node;
    }
    qptr->count = qptr->count+1;
}
 
 
int rm_queue(queue *qptr){
    int val;
    
    if (qptr->count==0) {
        return -1;
    }
    nptr tmp = qptr->front;
    qptr->front = tmp->next;
    val = tmp->data;
    free(tmp);
    qptr->count--;
    return val;
    
}
 
int get_count_queue(queue *qptr){
    return qptr->count;
}
 
void print(int *res, int index){
    int i;
    
    for (i=0; i<index; i++) {
        if (res[i]>=0) {
            printf("%d\n",res[i]);
        } else {
            printf("empty\n");
        }
    }
}
cs