CS/알고리즘

[알고리즘] 0.4 은행 대기번호 관리

겨울엔군고구마한잔 2022. 4. 16. 15:51

사람들이 차례를 기다리며 서있는 줄을 생각해보자.

앞에서부터 한 명씩 빠져나가 업무를 처리하는 줄을 큐(Queue)라고 한다.

 

은행에서 번호표를 받으면 큐에 들어가는 것을 볼 수 있고,

대기하던 고객이 자신의 번호가 불려져 창구에서 일을 처리하는 것은 큐에서 빠져나오는 것으로 볼 수 있다.

 

즉, 큐는 먼저 들어간 데이터가 먼저 나오는 자료구조를 말한다. 

반대로 스택(Stack)은 먼저 들어가나 데이터가 가장 나중에 나오는 자료구조다. 

여기서는 큐 자료구조를 구현해보자

 

1. 배열로 큐 작성하기

은행에서 대기 번호를 관리하는 프로그램을 작성해보자

 

[ 코드 ]

#include <iostream>

#define QUEIE_CAPACITY 8 // 큐에 사용되는 배열의 크기 설정

using namespace std;

int queue[QUEIE_CAPACITY];
int head = 0;
int tail = -1;
int queue_size = 0;

void enquene(int n){
	if (queue_size == QUEIE_CAPACITY){
		cout << "Queue Full !" << endl;
		return ;
	}
	tail++;
	queue_size++;
	queue[tail] = n;
}

int dequeue(){
	int r;
	if (queue_size ==0){
		cout << "Queue Empty!" << endl;
		return 0;
	}

	r = queue[head];
	head++;
	queue_size--;
	return r;
}

int main(void){
	int number, r;
	do {
		cout <<"Input number :" << endl;
		cin >> number;

		if (number >0){
			enquene(number);
		}

		else if (number ==0){
			r = dequeue();
			cout << r << endl;
		}
	}
	while (number >=0);

	return 0;
}

 

[ 결과 ] 

tot4766@tot4766:~/main/코딩/c++/알고리즘$ ./a.out
Input number :
1
Input number :
2
Input number :
3
Input number :
4
Input number :
5
Input number :
6
Input number :
7
Input number :
8
Input number :
9
Queue Full !
Input number :
0
1
Input number :
0
2
Input number :
0
3
Input number :
0
4
Input number :
0
5
Input number :
0
6
Input number :
0
7
Input number :
0
8
Input number :
0
Queue Empty!
0
Input number :
0
Queue Empty!
0
Input number :

 

2. 원형 큐 작성

앞의 배열의 경우에는 문제점이 있다.

앞의 번호들을 빼고, 다른 번호들을 넣었을 때라고 생각을 해보면,

Head의 위치가 고정되어 있으며, 이의 경우에는 상황에 따라 Head 위치를 지속적으로 반환시켜주어야 한다.

 

[ 코드 ]

#include <iostream>

#define QUEIE_CAPACITY 8 // 큐에 사용되는 배열의 크기 설정

using namespace std;

int queue[QUEIE_CAPACITY];
int head = 0;
int tail = -1;
int queue_size = 0;

void enquene(int n){
	if (queue_size == QUEIE_CAPACITY){
		cout << "Queue Full !" << endl;
		return ;
	}
	tail = (tail+1) % QUEIE_CAPACITY; // tail 증가
	queue_size++;
	queue[tail] = n;
}

int dequeue(){
	int r;
	if (queue_size ==0){
		cout << "Queue Empty!" << endl;
		return 0;
	}

	r = queue[head];
	head = (head+1) % QUEIE_CAPACITY;
	queue_size--;
	return r;
}

int main(void){
	int number, r;
	do {
		cout <<"Input number :" << endl;
		cin >> number;

		if (number >0){
			enquene(number);
		}

		else if (number ==0){
			r = dequeue();
			cout << r << endl;
		}
	}
	while (number >=0);

	return 0;
}

[ 결과 ]

tot4766@tot4766:~/main/코딩/c++/알고리즘$ ./a.out
Input number :
1
Input number :
2
Input number :
3
Input number :
4
Input number :
0
1
Input number :
0
2
Input number :
4
Input number :
5
Input number :
0
3
Input number :
0
4
Input number :
0
4
Input number :
0
5
Input number :
0
Queue Empty!
0
Input number :