Notice
Recent Posts
Recent Comments
Link
헬창 개발자
큐를 이용한 피보나치 수열 : C언어 본문
설계도
코드
#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); // 피보나치 수열 계산 함수를 호출
}
결과 화면
'자료구조' 카테고리의 다른 글
스택을 이용한 후위 표기, 연산 : 파이썬 (0) | 2021.07.29 |
---|---|
이진 트리를 이용한 연락처 프로그램 : C언어 (0) | 2021.07.28 |
깊이 우선 탐색(dfs), 넓이 우선 탐색(bfs) 구현 : C언어 (0) | 2021.07.23 |
스택을 이용한 회문 검사 프로그램 : C언어 (0) | 2021.07.22 |
이중 연결 리스트 구현 : C언어 (0) | 2021.07.21 |
Comments