610 likes | 823 Views
CHAPTER 3. 제한조건을 지닌 자료구조 스택 , 큐 , 데크. d. A. B. C. …. C. …. d. d. S. 3.1.2 큐 (queue) 의 개요. 2 개의 포인터를 가지고 한쪽 끝에서 삽입이 발생되고 다른 한쪽 끝에서 삭제가 일어나는 순차적 구조 뒤 (rear) 에서 노드가 삽입되고 앞 (front) 에서 삭제가 일어나도록 제한된다 가장 먼저 입력된 자료가 가장 먼저 출력되는 선입선출 (FIFO) 구조 적용분야
E N D
CHAPTER 3 제한조건을 지닌자료구조 스택, 큐, 데크
d A B C … C … d d S 3.1.2 큐(queue)의 개요 • 2개의 포인터를 가지고 한쪽 끝에서 삽입이 발생되고 다른 한쪽 끝에서 삭제가 일어나는 순차적 구조 • 뒤(rear)에서 노드가 삽입되고 앞(front)에서 삭제가 일어나도록 제한된다 • 가장 먼저 입력된 자료가 가장 먼저 출력되는 선입선출(FIFO)구조 • 적용분야 • 컴퓨터 운영체제에 쓰이는 작업의 계획(job scheduling)이나 시분할 방식 • 키보드를 사용한 컴퓨터로의 입력이나 모니터, 프린트기를 사용한 출력 앞(F) 삭제 삽입 뒤(R)
3.1.2 큐(queue)의 운영 • 선입선출(FIFO:First-In First-Out) • 제거는 앞(front)에서, 삽입은 뒤(rear)에서 발생 • 공백상태(empty)를 구분하기 위하여 • front : 실제 앞보다 1이 작은 위치를 가리킨다. • rear : 마지막으로 삽입된 원소를 가리킨다. • 큐(queue)의 입출력 • 입력순서 : ABCD • 출력순서 : ABCD A B C D front rear
d C … d d S 3.1.2 큐(queue)의 운영 초기상태의 큐 색인 1 2 3 4 5 자료 F = 0 R = 0
3.1.2 큐(queue)의 운영 ‘A’ 삽입 색인 1 2 3 4 5 d A C … d d S 자료 F = 0 R = 1
3.1.2 큐(queue)의 운영 ‘B’ ‘C’ 삽입 색인 1 2 3 4 5 d A B C C … d d S 자료 F = 0 R = 3
3.1.2 큐(queue)의 운영 ‘A’ 삭제 색인 1 2 3 4 5 d B C C … d d S 자료 F = 1 R = 3
3.1.2 큐(queue)의 운영 ‘D’ 삽입 색인 1 2 3 4 5 d B C D C … d d S 자료 F = 1 R = 4
3.1.2 큐(queue)의 운영 ‘B’ 삭제 색인 1 2 3 4 5 d C D C … d d S 자료 F = 2 R = 4
3.1.2 큐(queue)의 운영 • 삽입 알고리즘 procedure ADDQ(item, Q, n, rear) /* Q : 크기 n인 배열 */ if (rear = n ) then call QUEUE_FULL rear <- rear + 1 Q(rear) <- item end ADDQ • 제거 알고리즘 procedure DELETEQ(item, Q, n, rear) /* Q : 크기 n인 배열 */ if ( front = rear ) then call QUEUE_EMPTY front <- front + 1 item <- Q(front) end DELETEQ
예제 크기가 5인 큐에 D를 삽입시키는 경우와 A를 삭제시키는 경우를 알고리즘을 이용해서 구해 보자. 여기서 F는 1이고 R은 3이다. < D를 삽입시키는 경우 > N=5, front=1, rear=3, item=D rear을 1증가한 4값은 큐의 크기 5보다 크지 않으므로 Queue[4]에 D를 저장한다. < A를 삭제시키는 경우 > N=5, front=1, rear=3, front rear이므로 front를 1증가하여 Queue[2]의 A를 item에 저장하여 출력한다.
3.1.2 큐(queue)의 운영 • 이동 큐 • 큐가꽉찬 상태이면서 F가 0이 아닌 경우(R ear= n) 즉, 큐의 앞쪽이 비어 있는 경우 Front=0으로 하고 전체 원소를 앞쪽으로 이동(Rear = n - Front) • Q(1) - Q(n –Front) 까지 이동 • 큐가 비어있는상태 (Front =Rear) • 큐의 과잉 상태의 단점을 보완한 것이지만 큐 내의 전체 노드를 옮기는데 시간적인 손 실이 크다 • 특히 데이터 항목이 많으면 더욱 손실이 크다.
3.1.2 큐(queue)의 운영 • 원형큐(circular queue) • 큐가 비어있는데 QUEUE_FULL발생하는 단점을 보완 (큐의 구조상의 문제점을 보완한 표현 방식) • 크기가 n인 배열 Q(0:n-1)를 원형으로 간주 • front : 큐의 첫번째 원소로부터 반시계방향으로 하나 앞의 위치 • rear : 큐에 마지막으로 삽입된 원소의 위치rear값만 변화시켜 유용 공간에 직접 삽입
3.1.2 큐(queue)의 운영 원형 큐에서 item을 입력하는 알고리즘 procedure INS_Q( Queue, item, N, front, rear ) /* 큐의 최대 크기가 N인 배열 */ rear ← (rear+1) mod N; /* 시계 방향으로 rear 전진 */ if(front=rear) then full exit; /* 큐가 꽉찬 상태 */ else Queue[rear] ← item; end INS_Q 원형 큐에서 item을 출력하는 알고리즘 procedure DEL_Q( Queue, item, N, front, rear ) if(front=rear) then empty exit; /* 큐가 공백인 상태 */ else { front ← (front+1) mod N; /* 시계 방향으로 front 전진 */ item ← Queue(front); } /* front의 자료를 item에 저장 */ end DEL_Q
예제 크기가 5인 원형 큐에 S와 T를 삭제하려는 경우를 알고리즘을 이용해서 구해 보자. 여기서 F는 1이고 R은 3이다. < S를 삭제시키는 경우 > N=5, front=1, rear=3 front rear이므로 front=(1+1) mod 5 = 2 Queue[2]의 S를 item에 저장하여 출력한다. < T를 삭제시키는 경우 > N=5, front=2, rear=3 front rear이므로 front=(2+1) mod 5 = 3 Queue[3]의 T를 item에 저장하여 출력한다. front=rear가 되어 큐가 빈 상태가 된다.
예제 크기가 5인 원형 큐에 W를 삽입시키고 그 상태에서 X를 삽입시키는 경우를 알고리즘을 이용해서 구해 보자. 여기서 F는 1이고 R은 4이다. < W를 삽입시키는 경우 > N=5, front=1, rear=4, item=W rear=(4+1) mod 5 = 0 front rear이므로 Queue[0]에 W를 저장한다. < X를 삽입시키는 경우 > N=5, front=1, rear=0, item=X rear=(0+1) mod 5 = 1 front=rear이므로 큐가 꽉찬 상태로 삽입이 불가능하다.
3.2 스택(stack) 3.2.1스택 개요 • 선형리스트의 특별한 경우 • top이라는 자료구조의 끝에서만 삽입과 삭제 발생하는 자료구조 • 후입선출 구조(LIFO : Last-In Firtst-Out) • 삽입순서 : A, B, C, D • 제거순서 : D, C, B, A 삽입(push) 제거(pop) top dn . . d2 d1 bottom
3.2.1 스택의 개요 C B A • 후입선출 구조의 예1 : 기차가 차량기지를 거쳐서 철로로 진입할 수 있는 순열은? 차량기지(stack) 진행방향
3.2.1 스택의 개요 • 후입선출 구조의 예2 : 연탄 아궁이 • 연탄을 하나씩 쌓으면서 아궁이에 넣으므로 마지막에 넣은 3번 연탄이 가장 위에 쌓여 있다. • 연탄을 아궁이에서 꺼낼 때에는 위에서부터 하나씩 꺼내야 하므로 마지막에 넣은 3번 연탄을 가장 먼저 꺼내게 된다.
3.2.1 스택의 개요 • 후입선출 구조의 예3 : 슈퍼맨의 옷 갈아입기 • 수퍼맨이 옷을 벗는 순서 ① 장화 → ②망토 → ③빨간팬츠 → ④파란옷 • 슈퍼맨이 옷을 입는 순서 ④ 파란옷 → ③빨간팬츠 → ②망토 → ①장화
3.2.1스택 개요 스택 • 선형 리스트의 한 형태로 한쪽 끝을 통하여 모든 삽입과 삭제가 일어나는 구조 • 주기억장치나 레지스터의 일부를 할당하여 사용하는 임시적인 기억장치 • 삽입과 삭제가 일어나는 끝을 스택의 top이라 하고 그 반대쪽 끝을 바닥(bottom)이라 한다. • 선입후출 (First-In Last-Out : FILO) 또는 후입선출(Last-In First-Out : LIFO) TOP BOTTOM 스택의 동작 • top에서 삽입과 삭제가 이루어진다. • 삽입의 동작은 푸시(push)라 한다. • 삭제의 동작은 팝(pop)이라 한다. • 스택 포인터의 레지스터를 증가 혹은 감소하므로 이루어진다. 43
3.2.2스택의 운영 • 스택의 연산 • 스택에서의 삽입 연산 : push • 스택에서의 삭제 연산 : pop
3.2.2스택의 운영 • 스택에서의 원소 삽입/삭제 과정 • 공백 스택에 원소 A, B, C를 순서대로 삽입하고 한번 삭제하는 동안의 스택 변화
3.2.2스택의 운영 • 삽입 알고리즘 procedu0.e ADD(item, STACK, n, top) /* STACK : 크기가 n인 배열 */ if (top >= n ) then call STACK_FULL top <- top + 1 STACK(top) <- item end ADD • 제거 알고리즘 procedure DELETE(item, STACK, top) /* STACK : 크기가 n인 배열 */ if (top <= 0 ) then call STACK_EMPTY item <- STACK(top) top <- top - 1 end DELETE
연접 리스트를 이용한 스택 표현 index stack 5 4 TOP 3 2 1 연결리스트를 이용한 스택 표현 TOP : 스택을 동작시키기 위한 포인터 3.2.2스택의 운영 D C B A TOP D C A ^ B 47
3.2.2스택의 운영 • 순차 자료구조를 이용한 스택의 구현 • 순차 자료구조인 1차원 배열을 이용하여 구현 • 스택의 크기 : 배열의 크기 • 스택에 저장된 원소의 순서 : 배열 원소의 인덱스 • 인덱스 0번 : 스택의 첫번째 원소 • 인덱스 n-1번 : 스택의 n번째 원소 • 변수 top : 스택에 저장된 마지막 원소에 대한 인덱스 저장 • 공백 상태 : top = -1 (초기값) • 포화 상태 : top = n-1
3.2.2스택의 운영 • 크기가 5인 1차원 배열의 스택에서 연산 수행과정
3.2.2스택의 운영 • 역순 문자열 만들기 • 스택의 후입선출(LIFO) 성질을 이용 • 문자열을 순서대로 스택에 push 하기
3.2.2스택의 운영 • 스택을 pop하여 문자열로 저장하기 • 순차 자료구조로 구현한 스택의 장점 • 순차 자료구조인 1차원 배열을 사용하여 쉽게 구현 • 순차 자료구조로 구현한 스택의 단점 • 물리적으로 크기가 고정된 배열을 사용하므로 스택의 크기 변경 어려움 • 순차 자료구조의 단점을 그대로 가지고 있다.
3.2.2스택의 운영 • 연결 자료구조를 이용한 스택의 구현 • 단순 연결 리스트를 이용하여 구현 • 스택의 원소 : 단순 연결 리스트의 노드 • 스택 원소의 순서 : 노드의 링크 포인터로 연결 • push : 리스트의 마지막에 노드 삽입 • pop : 리스트의 마지막 노드 삭제 • 변수 top : 단순 연결 리스트의 마지막 노드를 가리키는 포인터 변수 • 초기 상태 : top = null
3.2.2스택의 운영 연결리스트를 이용한 스택 표현 • 자료가 입력될 때와 출력될 때 top의 위치는 각 노드의 포인터를 지적해야 된다. • 스택을 연결 리스트로 실현하면 스택의 과잉 상태(overflow)를 막을 수 있다. • 스택에 사용할 기억 공간을 일단 필요한 만큼만 배당 받고, 프로그램의 실행 중에 기억 공간이 더 필요해진다면 그 만큼 더 배당 받을 수 있다. • 한 원소를 팝시켜서 생긴 빈 기억 장소는 메모리 관리기에 다시 반환하여 기억 장소를 효율적으로 사용하는 장점 • 메모리 관리기를 호출하게 되어 그만큼 프로그램 실행 시간이 길어지는 단점.
3.2.2스택의 운영 • 단순 연결 리스트의 스택에서 연산 수행과정 • 공백 스택 생성 : create(stack); • 원소 A 삽입 : push(stack, A); • 원소 B 삽입 : push(stack, B);
3.2.2스택의 운영 • 원소 C 삽입 :push(stack, C); • 원소 삭제 :pop(stack);
스택 활용 - 부프로그램 3.2.3스택의 활용 부프로그램 차후에 원상 복귀(return)시켜서 처리할 정보를 저장할 때 사용한다. 부프로그램을 호출하기 이전에 기억하고 있어야 할 내용을 스택에 저장한다. 스택에 저장된 자료는 호출한 프로그램으로 복귀하기 위한 주소이다.
3.2.3스택의 활용 • 시스템 스택 • 프로그램에서의 호출과 복귀에 따른 수행 순서를 관리 • 가장 마지막에 호출된 함수가 가장 먼저 실행을 완료하고 복귀하는 후입선출 구조의 스택을 이용하여 수행순서 관리 • 함수 호출이 발생하면 호출한 함수 수행에 필요한 지역변수, 매개변수 및 수행 후 복귀할 주소 등의 정보를 스택 프레임(stack frame)에 저장하여 시스템 스택에 삽입 • 함수의 실행이 끝나면 시스템 스택의 top 원소(스택 프레임)를 삭제(pop)하면서 프레임에 저장되어있던 복귀주소를 확인하고 복귀 • 함수 호출과 복귀에 따라 이 과정을 반복하여 전체 프로그램 수행이 종료되면 시스템스택은 공백 스택이 된다.
스택 활용 – 수식 계산 3.2.3스택의 운영 중위 표기법의 수식을 입력으로 받아들여 후위 표기법으로 표기한 후에 스택을 이용하면 수식을 간단하게 계산할 수 있다. (X = ((A - ((B * C) / D)) + E)) XABC*D/-E+= 왼쪽에서 오른쪽으로 하나씩 읽어 나간다. 이때 연산자가 나타나면 왼쪽에 있는 두개의 피연산자에 대하여 연산을 하고 두개의 피연산자와 연산자를 제거하여 그 위치에 연산의 결과를 놓는다. 이러한 과정을 더 이상의 연산자가 없을 때까지 모든 연산자에 대하여 수행한다. 중위 표기를 후위 표기법으로 바꾸는 방법 중위 표기인 산술식 X=A-B*C/D+E를 계산 순서에 맞게 괄호를 묶는다. (X = ((A - ((B * C) / D)) + E)) 괄호 안의 연산자를 연산 우선 순위로 그 식의 오른쪽 괄호 밖으로 옮긴다. 괄호를 제거하면 XABC*D/-E+=가 되어 후위 표기로 변환한다. 중위 표기를 전위 표기로 변환하는 방법은 같은 방법으로 하되 연산자를 왼쪽 괄호 밖으로 옮기면 된다.
3.2.3스택의 운영 • 수식의 표기법 • 전위표기법(prefix notation) • 연산자를 앞에 표기하고 그 뒤에 피연산자를 표기하는 방법 • 예) +AB • 중위표기법(infix notation) • 연산자를 피연산자의 가운데 표기하는 방법 • 예) A+B • 후위표기법(postfix notation) • 연산자를 피연산자 뒤에 표기하는 방법 • 예) AB+
3.2.3스택의 운영 • 중위표기식의 전위표기식 변환 방법 • 예) A*B-C/D • 1단계: ( (A*B)-(C/D)) • 2단계: ⇒ -(*(A B)/(C D)) • 3단계: -*AB/CD ① 수식의 각 연산자에 대해서 우선순위에 따라 괄호를 사용하여 다시 표현한다. ② 각 연산자를 그에 대응하는 왼쪽괄호의 앞으로 이동시킨다. ③ 괄호를 제거한다.
3.2.3스택의 운영 • 중위표기식의 후위표기식 변환 방법 • 예) A*B-C/D • 1단계: ( (A*B)-(C/D)) • 2단계: ⇒ ( (A B)*(C D)/ )- • 3단계: AB*CD/- ① 수식의 각 연산자에 대해서 우선순위에 따라 괄호를 사용하여 다시 표현한다. ② 각 연산자를 그에 대응하는 오른쪽괄호의 뒤로 이동시킨다. ③ 괄호를 제거한다.
3.2.3스택의 운영 • 스택을 사용하여 입력된 중위표기식을 후위표기식으로 변환 • 변환 방법 • 왼쪽 괄호를 만나면 무시하고 다음 문자를 읽는다. • 피연산자를 만나면 출력한다. • 연산자를 만나면 스택에 push한다. • 오른쪽괄호를 만나면 스택을 pop하여 출력한다. • 수식이 끝나면, 스택이 공백이 될 때까지 pop하여 출력한다.
3.2.3스택의 운영 • 예) ((A*B)-(C/D))
3.2.3스택의 운영 • 예) ((A*B)-(C/D))
3.2.3스택의 운영 • 예) ((A*B)-(C/D))
3.2.3스택의 운영 • 예) ((A*B)-(C/D))
3.2.3스택의 운영 • 스택을 사용하여 후위표기식을 연산 • 연산 방법 • 수식이 끝나고 스택에 마지막으로 남아있는 원소는 전체 수식의 연산결과 값이 된다. • 피연산자를 만나면 스택에 push한다. • 연산자를 만나면 필요한 만큼의 피연산자를 스택에서 pop하여 연산하고, 연산결과를 다시 스택에 push한다. • 수식이 끝나면, 마지막으로 스택을 pop하여 출력한다.
3.2.3스택의 운영 • 예) AB*CD/-
3.2.3스택의 운영 • 예) AB*CD/-
3.2.3스택의 운영 • 예) AB*CD/-
예제 1.다음 중위표기 수식을 후위표기로 변환하라. Y = A + B * C - D ** E / F + G 후위 표기식 (Y = (((A + (B * C) ) - ((D ** E) / F) ) + G) )에서 모든 연산자를 자신이 속한 괄호 바로 바깥으로 빼어 내면 된다. YABC*+DE**F/-G+= (Y = (A + ((B * C) - (((D ** E) / F) + G) ) ) )에서 모든 연산자를 자신이 속한 괄호 바로 바깥으로 빼어 내면 된다. YABC*DE**F/G+- =
예제 2. X = A / B ** C * D + E XABC ** /D*EF+= 3. A = B * C * ( E - F ) ABC *EF-*= • X = A / B ** C + D * E - A * C XABC ** /DE*+AC*-= 5. X = A + ( B + C / D ) * E - F XABCD /+E*+F-= 6. X = B * C + D * ( E - F ) XBC *DEF-*=