주뇽's 저장소

C로 구현하는 자료구조 큐 본문

알고리즘/스택, 큐

C로 구현하는 자료구조 큐

뎁쭌 2023. 7. 4. 18:25
728x90
반응형

QUEUE

  • 먼저 들어온 데이터가 먼저 나가는 자료구조
  • 선입선출(FIFO: First-In-First-Out)
    ex) 매표소의 대기열
  • 통신에서의 데이터 패킷들의 모델링에 이용
  • 프린터와 컴퓨터 사이의 버퍼링
  • 스택과 마찬가지로 프로그래머의 도구
  • 많은 알고리즘에서 사용
  • 우선순위 QUEUE-> Heep

구현

front , rear = -1 로 초기화
rear : 입력
front : 출력

선형큐

  • 배열을 선형으로 사용하여 큐를 구현
    # 입력이 많으면 overflow가 발생가능함 쓰지않는 메모리가 많아짐
    비어있음에도 불구하고 못 쓰는 공간이 생김
    결론적으로 선형큐는 사용하지 않는다.
    구현
  • init()
  • isFull()
  • isEmpty()
  • push(char elem)
  • pop()
  • peek()
  • print()
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SIZE 100

typedef struct 
{
   char data[SIZE];
   int front, rear;
    /* data */
}QueueType;


void init(QueueType * Q){
    Q->front = -1;
    Q->rear = -1;
}

int isEmpty(QueueType * Q){
    return Q->rear == Q->front;
} //front 와 rear가 만난경우

int isFull(QueueType * Q){
    return Q->rear == (SIZE -1);
}

void enqueue(QueueType * Q, char elem){
    if (isFull(Q)){
        printf("Queue is Full!!\n");
        return;
    }
    Q->rear++;
    Q->data[Q->rear] = elem;
}

char dequeue(QueueType * Q){
    if(isEmpty(Q)){
        printf("Queue is Empty!!!\n");
        return -1;
    }
    Q->front++;
    return Q->data[Q->front];
}

void print(QueueType * Q){
    printf("Front pos : %d, Rear pos : %d \n", Q->front, Q->rear);

    for(int i= Q->front +1; i<= Q->rear; i++){
        printf("[%c]", Q->data[i]);
    }
    printf("\n");

    // while(!isEmpty(Q)){
    //     Q->front ++;
    //     printf("Queue is %c ", Q->data[Q->front]);
    // }
}


int main(void){
    QueueType Q;
    init(&Q);
    srand(time(NULL));

    //rand()% 26 + 65 //65~91까지
    for(int i=0; i<7; i++)
        enqueue(&Q, rand()% 26 + 65 ); // 함수는 문자를 받기 때문에 정수를 변환해야 함

    print(&Q); getchar();

    for(int i=0; i<3; i++)
        printf("[%c] ", dequeue(&Q)); 


    printf("\n\n");
    print(&Q); getchar();

    for(int i=0; i<5; i++)
        enqueue(&Q, rand()% 26 + 65 ); // 함수는 문자를 받기 때문에 정수를 변환해야 함
    print(&Q); getchar();

    for(int i=0; i<3; i++)
        printf("[%c] ", dequeue(&Q)); 

    printf("\n\n");
    print(&Q); getchar();


    return 0;
}

원형큐

  • 배열을 원형으로 사용하여 큐를 구현
# 입력 rear가 인덱스의 끝에 도달했을 경우 다시 처음으로 돌아가는 방식
q->read % size == 0 자신의 인덱스
기존에 구현했던 선형 큐에서 몇 가지 함수만을 수정
front , rear = 0으로 초기화
front가 가르키는 공간은 항상 공백이여야 함

구현

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SIZE 10

typedef struct 
{
   char data[SIZE];
   int front, rear;
}QueueType;


void init(QueueType * Q){
    Q->front = 0;
    Q->rear = 0;
}//수정

int isEmpty(QueueType * Q){
    return Q->rear == Q->front;
} //front 와 rear가 만난경우

int isFull(QueueType * Q){
    return Q->front == (Q->rear+1) %SIZE;
}//수정

void enqueue(QueueType * Q, char elem){
    if (isFull(Q)){
        printf("Queue is Full!!\n");
        return;
    }
    Q->rear = (Q->rear+1) % SIZE;
    Q->data[Q->rear] = elem;
}//수정

char dequeue(QueueType * Q){
    if(isEmpty(Q)){
        printf("Queue is Empty!!!\n");
        return -1;
    }
    Q->front = (Q->front+1) % SIZE;
    return Q->data[Q->front];
}  //수정


char peek(QueueType * Q){
    if(isEmpty(Q)){
        printf("Queue is Empty!!!\n");
        return -1;
    }
    return Q->data[(Q->front+1)%SIZE];
}//수정

void print(QueueType * Q){
    printf("Front pos : %d, Rear pos : %d \n", Q->front, Q->rear);
    int i = Q->front ;
    while(i!=Q->rear){
        i = (i+1) % SIZE;
        printf("[%c] ", Q->data[i]);
    }
    printf("\n");
}//수정
int main(void){
    QueueType Q;
    init(&Q);
    srand(time(NULL));

    //rand()% 26 + 65 //65~91까지
    for(int i=0; i<7; i++)
        enqueue(&Q, rand()% 26 + 65 ); // 함수는 문자를 받기 때문에 정수를 변환해야 함

    print(&Q); getchar();

    for(int i=0; i<3; i++)
        printf("[%c] ", dequeue(&Q)); 


    printf("\n\n");
    print(&Q); getchar();

    for(int i=0; i<5; i++)
        enqueue(&Q, rand()% 26 + 65 ); // 함수는 문자를 받기 때문에 정수를 변환해야 함
    print(&Q); getchar();

    for(int i=0; i<3; i++)
        printf("[%c] ", dequeue(&Q)); 

    printf("\n\n");
    print(&Q); getchar();

    return 0;
}

Java로 스택과 큐를 구현

import java.util.Scanner;

class stack{
    int point;
    char data[] = new char[100];

    public void init(){
        this. point = -1;
        System.out.print(" Stack is initialized ");
        System.out.println();
    } //init

    public boolean isFull(){
        if(this.point == 100){
            System.out.print(" Stack is Full ");
            return true;
        }
        return false;
    } //isfull

    public boolean isEmpty(){
        if(this.point == -1){
            System.out.print(" Stack is Empty ");
            return true;
        }
        return false;
    } //empty
    public void push(char elem){
        if(this.isFull()){
            return ;
        }
        this.point++;
        this.data[this.point] = elem;
    }
    public char pop(){
        if(this.isEmpty()){
            return 'e';
        }
        else {
            char temp = this.data[this.point];
            this.point --;
            return temp;
        }
    }

    public char peek(){
        if(this.isEmpty())
            return 'e';
        else
            return this.data[this.point]; 
    }

    public void print(){
        for(int i=0; i<=this.point; i++){
            System.out.print(this.data[i]);
        }
        System.out.println();
    }
}

    class Queue{
        int front;
        int rear;
        char data[] = new char[100];

        public void init(){
            System.out.print(" Queue is initialized ");
            System.out.println();
            this.front = 0;
            this.rear = 0;
        }
        public boolean isFull(){
            if(this.rear == 100-1){
                return true;
            }
            else return false;
        }
        public boolean isEmpty(){
            if(this.rear == this.front){
                return true;
            }
            else return false;
        }   
        public void push(char elem){
            if(isFull()){return ;}
            this.data[this.rear] = elem;
            rear++;
        }

        public char pop(){
            if(isEmpty()){return '1';}
            else{
                char temp;
                temp = this.data[this.front];
                front ++;
                return temp;
            }
        }
        public void print(){
            for(int i=this.front; i< this.rear; i++){
                System.out.print(this.data[i]);
            }
            System.out.println();
        }

    }//Queue

    public class data{

    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        System.out.print(" >> ");
        System.out.println();
        stack S = new stack();
        Queue Q = new Queue();
        S.init();
        Q.init();
        String str = "ABCDEFG";
        int len = str.length();
        for(int i=0; i<len; i++){
            S.push(str.charAt(i));
            Q.push(str.charAt(i));

        }
        S.print();
        Q.print();


        for(int i=0; i<len; i++){
           System.out.print ("Stack pop is : " +S.pop());
           System.out.print (" Queue pop is : " + Q.pop());
           System.out.println();
        }
        sc.close();
    }

    }