enQueue( )와 deQueue( ) 함수를 이용한 원형큐 - C 언어

2021. 5. 26. 20:45·C
728x90
반응형

스택에 대한 설명 👇🏻

https://tildacoderecorder.tistory.com/101

 

[자료구조] push( ) 와 pop( ) 함수를 이용한 스택

스택의 개념과 구조 : 스택은 마지막에 삽입한 원소는 맨 위에 쌓여 있다가 가장 먼저 삭제 됨 / 후입선출 구조 ( LIFO, Last-In-First-Out ) 스택에서의 삽입 연산 : push 스택에서의 삭제 연산 : pop 기본

tildacoderecorder.tistory.com

큐의 개념과 구조

큐 : 스택과 다르게 "선입선출"의 구조를 가지고 있다. 먼저 들어간 것이 먼저 나오는 구조. FIFO = First In First Out

순차큐의 문제점을 보완해 나온 것이 원형큐 = 1차원 배열을 사용하면서 논리적으로 처음과 끝이 원처럼 연결되어 있다고 가정하고 사용. ( 순차큐 설명 생략 )

크기가 8인 1차원 배열의 원형큐

front = 저장된 원소 중에서 첫번째 원소를 가리키는 변수, rear = 저장된 원소 중 마지막 원소를 가리키는 변수

배열이 원으로 이어져 있다고 가정하기 때문에 배열의 마지막 인덱스인 n-1에서 다음 자리인 인덱스 0으로 이동하기 위해 나머지 계산을 함. 

ex ) 위 그림처럼 크기가 8인 배열이 있을 때, 마지막 인덱스인 7에서 다음 인덱스인 0으로 이동하려면 (인덱스+1) % (배열의 크기)를 해야 한다. ( 7 + 1 ) % 8 = 1...0 인덱스는 0

 

즉, 삽입 위치는 각각 front = (front+1) % n, rear = (rear+1) % n이다.

초기 공백 상태는 front = rear = 0

! 조건 : 공백 상태와 포화 상태를 구분하기 위해서 front는 빈 자리로 남겨둠.

 

기본 설정

1
2
#define N 10
int Q[N], front=0, rear=0;
cs

 

크기가 10인 1차원 배열 Q를 만들고 front와 rear를 0으로 초기화시킨다.

 

원형큐의 삽입 함수 enQueue( )

: 먼저 원형큐가 포화 상태인지 확인해야 한다. front를 비워둔 채 원소를 꾸준히 삽입해 큐가 가득찬 상태라면 마지막 원소를 가리키는 rear의 다음은 front여야 한다. (front를 빼고 모든 원소가 차 있기 때문)

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
 
#define N 10
int Q[N], front=0, rear=0;
 
int enQueue(int num) {
  if ((rear+1) % N == front) printf("ERROR!"); return 0;
 
  rear = (rear+1) % N;
  Q[rear] = num;
  return 1;
 
}
Colored by Color Scripter
cs

 

if문으로 포화 상태인지 아닌지 확인한다. ( rear + 1 ) % N == front로 rear의 다음이 front인지 판별.

포화 상태라면 에러 메세지를 출력하고 0을 리턴하며 종료.

포화 상태가 아니라면 rear = ( rear+1 ) % N로 위치를 이동하고 이동한 자리에 삽입할 원소 num을 넣어준다. Q[rear] = num. 정상적으로 삽입이 되었으므로 1을 리턴하며 종료.

 

원형큐의 삭제 함수 deQueue()

: 원형큐가 공백 상태인지 확인해야 한다. front와 rear의 초기값은 0이므로 삽입된 만큼 똑같이 삭제 되었다면 둘의 위치는 같다. ex) 크기가 5인 배열에서 2번 삽입하면 front의 위치는 0, rear의 위치는 2이지만 같은 횟수로 2번 삭제하면 front의 위치는 2, rear의 위치도 2.

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
 
#define N 10
int Q[N], front=0, rear=0;
 
int deQueue() {
  if( front == rear ) printf("ERROR!"); return 0;
 
  front = (front+1) % N;
  return Q[front];
 
}
Colored by Color Scripter
cs

 

if문으로 공백 상태인지 아닌지 확인한다. front == rear이라면 공백 상태이므로 에러 메세지를 출력하고 0을 리턴하며 종료.

공백 상태가 아니라면 front를 다음 자리로 넘겨주고 그 자리에 있던 원소를 반환해 삭제한다.

front의 자리를 먼저 옮기는 이유는 front는 비워두는 조건 때문.

 

참조 : C로 배우는 쉬운 자료구조 / 이지영 / 한빛아카데미

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'C' 카테고리의 다른 글

트리와 이진트리의 개념과 구조 - C언어  (0) 2021.05.28
연결리스트를 이용한 큐의 구현 | 연결큐 - C 언어  (0) 2021.05.27
push( ) 와 pop( ) 함수를 이용한 스택 - C 언어  (0) 2021.04.22
선형 리스트 삽입/삭제/탐색/종료 - C 언어  (0) 2021.04.16
연결리스트(Linked list) 노드 삭제 - C 언어  (0) 2021.04.09
'C' 카테고리의 다른 글
  • 트리와 이진트리의 개념과 구조 - C언어
  • 연결리스트를 이용한 큐의 구현 | 연결큐 - C 언어
  • push( ) 와 pop( ) 함수를 이용한 스택 - C 언어
  • 선형 리스트 삽입/삭제/탐색/종료 - C 언어
waVwe
waVwe
    반응형
  • waVwe
    waVwe 개발 블로그
    waVwe
  • 전체
    오늘
    어제
    • ALL (184)
      • Python (1)
      • Spring (15)
      • DevOps (10)
      • Git (6)
      • JAVA (4)
      • C (22)
      • 코테 문제 풀이 (124)
        • 프로그래머스 (43)
        • 백준 (2)
        • 정올 (64)
        • SW Expert Academy (1)
        • 온코더 oncoder (14)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

    • 🐙 Github
  • 공지사항

  • 인기 글

  • 태그

    progate
    도커
    알고리즘
    스프링
    MSA
    자바
    devops
    스프링부트
    C언어
    스파르타코딩클럽
    docker
    형변환
    이진트리
    Til
    연결리스트
    깃헙
    프로그래머스
    내일배움캠프
    정올
    java
    온코더
    springboot
    아파치카프카
    깃
    스파르타코딩
    while문
    코테
    CI/CD
    C
    자료구조
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
waVwe
enQueue( )와 deQueue( ) 함수를 이용한 원형큐 - C 언어
상단으로

티스토리툴바