헬창 개발자

큐를 이용한 피보나치 수열 : C언어 본문

자료구조

큐를 이용한 피보나치 수열 : C언어

찬배 2021. 7. 27. 17:33
설계도

코드
#include <stdio.h>
#define MAX 5 // 배열의 범위 정의
typedef struct que { // 구조체 정의
	int front; // 큐의 첫 요소의 앞을 가리킴
	int rear; // 큐의 마지막 요소를 가리킴
	int data[MAX]; // 큐 
}que;
int is_full(que *fx) { // 큐가 가득 찼는지 검사하는 함수
	if ((fx->rear+1)%MAX == fx->front) return 1; // front+1의 값과 rear의 값이 같으면 가득참
	else 0;
}
int is_empty(que* fx) { // 큐가 비어있는지 검사하는 함수
	if (fx->front == fx->rear) return 1; // front의 값과 rear의 값이 같으면 비어있음
	else 0;
}
void init(que* fx) { // 큐 초기화 함수
	fx->front = 0; // front 값을 0으로 초기화
	fx->rear = 0; // rear 값을 0으로 초기화
}
int enqueue(que* fx, int n) { // 큐의 요소를 추가하는 함수
	if (!is_full(fx)) { // 가득찼는지 검사
		printf("오류(가득참)");
		return 0;
	}
	fx->rear = (fx->rear + 1) % MAX; // (rear+1)%MAX는 큐의 마지막 요소뒤를 가리킴
	fx->data[fx->rear] = n; // 마지막 요소뒤에 데이터를 삽입
}
int dequeue(que* fx) { // 큐의 앞에 있는 요소를 반환하는 함수
	if (!is_empty(fx)) { // 비어있는지 검사
		printf("오류(비어있음)");
		return 0;
	}
	fx->front = (fx->front + 1) % MAX; // (front+1)%MAX는 큐의 앞에 있는 첫 요소를 가리킴
	return fx->data[fx->front]; // 첫 요소를 반횐
}
int fibo(que *fx, int n) { // 피보나치 수열을 계산하는 함수
	for (int i = 0; i < n; i++) // n까지 반복 실행
	{
		if (i == 0) printf("0\n"); // i=0 이면 0 출력
		if (i == 1) printf("1\n"); // i=1 이면 1 출력
		if (i >= 2) { // i가 2보다 크면 조건 만족
			int temp = dequeue(fx); // temp에 큐에 첫번째 요소를 삽입
			enqueue(fx, temp + (fx->data[fx->rear])); // 큐에 첫번째 요소와 마지막 요소를 더해서 마지막 다음 요소에 삽입
			printf("%d\n", fx->data[fx->rear]); // 큐에 마지막 요소를 출력
		}
	}
}
int main() {
	int n; // 입력 받을 n번째 피보나치 수열
	que fx; // 큐 생성
	init(&fx); // 큐 초기화
	enqueue(&fx, 0); // 문제의 조건인 첫 번째 요소에 0 대입
	enqueue(&fx, 1); // 문제의 조건인 두 번째 요소에 1 대입

	printf("몇번째 피보나치 수열을 구하고 싶으십니까?>> ");
	scanf_s("%d", &n); // n의 값을 입력 받음
	fibo(&fx, n); // 피보나치 수열 계산 함수를 호출
}
결과 화면

Comments