1 / 61

CHAPTER 3

CHAPTER 3. 제한조건을 지닌 자료구조 스택 , 큐 , 데크. d. A. B. C. …. C. …. d. d. S. 3.1.2 큐 (queue) 의 개요. 2 개의 포인터를 가지고 한쪽 끝에서 삽입이 발생되고 다른 한쪽 끝에서 삭제가 일어나는 순차적 구조 뒤 (rear) 에서 노드가 삽입되고 앞 (front) 에서 삭제가 일어나도록 제한된다 가장 먼저 입력된 자료가 가장 먼저 출력되는 선입선출 (FIFO) 구조 적용분야

Télécharger la présentation

CHAPTER 3

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CHAPTER 3 제한조건을 지닌자료구조 스택, 큐, 데크

  2. d A B C … C … d d S 3.1.2 큐(queue)의 개요 • 2개의 포인터를 가지고 한쪽 끝에서 삽입이 발생되고 다른 한쪽 끝에서 삭제가 일어나는 순차적 구조 • 뒤(rear)에서 노드가 삽입되고 앞(front)에서 삭제가 일어나도록 제한된다 • 가장 먼저 입력된 자료가 가장 먼저 출력되는 선입선출(FIFO)구조 • 적용분야 • 컴퓨터 운영체제에 쓰이는 작업의 계획(job scheduling)이나 시분할 방식 • 키보드를 사용한 컴퓨터로의 입력이나 모니터, 프린트기를 사용한 출력 앞(F) 삭제 삽입 뒤(R)

  3. 3.1.2 큐(queue)의 운영 • 선입선출(FIFO:First-In First-Out) • 제거는 앞(front)에서, 삽입은 뒤(rear)에서 발생 • 공백상태(empty)를 구분하기 위하여 • front : 실제 앞보다 1이 작은 위치를 가리킨다. • rear : 마지막으로 삽입된 원소를 가리킨다. • 큐(queue)의 입출력 • 입력순서 : ABCD • 출력순서 : ABCD A B C D front rear

  4. d C … d d S 3.1.2 큐(queue)의 운영 초기상태의 큐 색인 1 2 3 4 5 자료 F = 0 R = 0

  5. 3.1.2 큐(queue)의 운영 ‘A’ 삽입 색인 1 2 3 4 5 d A C … d d S 자료 F = 0 R = 1

  6. 3.1.2 큐(queue)의 운영 ‘B’ ‘C’ 삽입 색인 1 2 3 4 5 d A B C C … d d S 자료 F = 0 R = 3

  7. 3.1.2 큐(queue)의 운영 ‘A’ 삭제 색인 1 2 3 4 5 d B C C … d d S 자료 F = 1 R = 3

  8. 3.1.2 큐(queue)의 운영 ‘D’ 삽입 색인 1 2 3 4 5 d B C D C … d d S 자료 F = 1 R = 4

  9. 3.1.2 큐(queue)의 운영 ‘B’ 삭제 색인 1 2 3 4 5 d C D C … d d S 자료 F = 2 R = 4

  10. 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

  11. 예제 크기가 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에 저장하여 출력한다.

  12. 3.1.2 큐(queue)의 운영 • 이동 큐 • 큐가꽉찬 상태이면서 F가 0이 아닌 경우(R ear= n) 즉, 큐의 앞쪽이 비어 있는 경우 Front=0으로 하고 전체 원소를 앞쪽으로 이동(Rear = n - Front) • Q(1) - Q(n –Front) 까지 이동 • 큐가 비어있는상태 (Front =Rear) • 큐의 과잉 상태의 단점을 보완한 것이지만 큐 내의 전체 노드를 옮기는데 시간적인 손 실이 크다 • 특히 데이터 항목이 많으면 더욱 손실이 크다.

  13. 3.1.2 큐(queue)의 운영 • 원형큐(circular queue) • 큐가 비어있는데 QUEUE_FULL발생하는 단점을 보완 (큐의 구조상의 문제점을 보완한 표현 방식) • 크기가 n인 배열 Q(0:n-1)를 원형으로 간주 • front : 큐의 첫번째 원소로부터 반시계방향으로 하나 앞의 위치 • rear : 큐에 마지막으로 삽입된 원소의 위치rear값만 변화시켜 유용 공간에 직접 삽입

  14. 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

  15. 예제 크기가 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가 되어 큐가 빈 상태가 된다.

  16. 예제 크기가 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이므로 큐가 꽉찬 상태로 삽입이 불가능하다.

  17. 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

  18. 3.2.1 스택의 개요 C B A • 후입선출 구조의 예1 : 기차가 차량기지를 거쳐서 철로로 진입할 수 있는 순열은? 차량기지(stack) 진행방향

  19. 3.2.1 스택의 개요 • 후입선출 구조의 예2 : 연탄 아궁이 • 연탄을 하나씩 쌓으면서 아궁이에 넣으므로 마지막에 넣은 3번 연탄이 가장 위에 쌓여 있다. • 연탄을 아궁이에서 꺼낼 때에는 위에서부터 하나씩 꺼내야 하므로 마지막에 넣은 3번 연탄을 가장 먼저 꺼내게 된다.

  20. 3.2.1 스택의 개요 • 후입선출 구조의 예3 : 슈퍼맨의 옷 갈아입기 • 수퍼맨이 옷을 벗는 순서 ① 장화 → ②망토 → ③빨간팬츠 → ④파란옷 • 슈퍼맨이 옷을 입는 순서 ④ 파란옷 → ③빨간팬츠 → ②망토 → ①장화

  21. 3.2.1스택 개요 스택 • 선형 리스트의 한 형태로 한쪽 끝을 통하여 모든 삽입과 삭제가 일어나는 구조 • 주기억장치나 레지스터의 일부를 할당하여 사용하는 임시적인 기억장치 • 삽입과 삭제가 일어나는 끝을 스택의 top이라 하고 그 반대쪽 끝을 바닥(bottom)이라 한다. • 선입후출 (First-In Last-Out : FILO) 또는 후입선출(Last-In First-Out : LIFO) TOP BOTTOM 스택의 동작 • top에서 삽입과 삭제가 이루어진다. • 삽입의 동작은 푸시(push)라 한다. • 삭제의 동작은 팝(pop)이라 한다. • 스택 포인터의 레지스터를 증가 혹은 감소하므로 이루어진다. 43

  22. 3.2.2스택의 운영 • 스택의 연산 • 스택에서의 삽입 연산 : push • 스택에서의 삭제 연산 : pop

  23. 3.2.2스택의 운영 • 스택에서의 원소 삽입/삭제 과정 • 공백 스택에 원소 A, B, C를 순서대로 삽입하고 한번 삭제하는 동안의 스택 변화

  24. 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

  25. 연접 리스트를 이용한 스택 표현 index stack 5 4 TOP 3 2 1 연결리스트를 이용한 스택 표현 TOP : 스택을 동작시키기 위한 포인터 3.2.2스택의 운영 D C B A TOP D C A ^ B 47

  26. 3.2.2스택의 운영 • 순차 자료구조를 이용한 스택의 구현 • 순차 자료구조인 1차원 배열을 이용하여 구현 • 스택의 크기 : 배열의 크기 • 스택에 저장된 원소의 순서 : 배열 원소의 인덱스 • 인덱스 0번 : 스택의 첫번째 원소 • 인덱스 n-1번 : 스택의 n번째 원소 • 변수 top : 스택에 저장된 마지막 원소에 대한 인덱스 저장 • 공백 상태 : top = -1 (초기값) • 포화 상태 : top = n-1

  27. 3.2.2스택의 운영 • 크기가 5인 1차원 배열의 스택에서 연산 수행과정

  28. 3.2.2스택의 운영 • 역순 문자열 만들기 • 스택의 후입선출(LIFO) 성질을 이용 • 문자열을 순서대로 스택에 push 하기

  29. 3.2.2스택의 운영 • 스택을 pop하여 문자열로 저장하기 • 순차 자료구조로 구현한 스택의 장점 • 순차 자료구조인 1차원 배열을 사용하여 쉽게 구현 • 순차 자료구조로 구현한 스택의 단점 • 물리적으로 크기가 고정된 배열을 사용하므로 스택의 크기 변경 어려움 • 순차 자료구조의 단점을 그대로 가지고 있다.

  30. 3.2.2스택의 운영 • 연결 자료구조를 이용한 스택의 구현 • 단순 연결 리스트를 이용하여 구현 • 스택의 원소 : 단순 연결 리스트의 노드 • 스택 원소의 순서 : 노드의 링크 포인터로 연결 • push : 리스트의 마지막에 노드 삽입 • pop : 리스트의 마지막 노드 삭제 • 변수 top : 단순 연결 리스트의 마지막 노드를 가리키는 포인터 변수 • 초기 상태 : top = null

  31. 3.2.2스택의 운영 연결리스트를 이용한 스택 표현 • 자료가 입력될 때와 출력될 때 top의 위치는 각 노드의 포인터를 지적해야 된다. • 스택을 연결 리스트로 실현하면 스택의 과잉 상태(overflow)를 막을 수 있다. • 스택에 사용할 기억 공간을 일단 필요한 만큼만 배당 받고, 프로그램의 실행 중에 기억 공간이 더 필요해진다면 그 만큼 더 배당 받을 수 있다. • 한 원소를 팝시켜서 생긴 빈 기억 장소는 메모리 관리기에 다시 반환하여 기억 장소를 효율적으로 사용하는 장점 • 메모리 관리기를 호출하게 되어 그만큼 프로그램 실행 시간이 길어지는 단점.

  32. 3.2.2스택의 운영 • 단순 연결 리스트의 스택에서 연산 수행과정 • 공백 스택 생성 : create(stack); • 원소 A 삽입 : push(stack, A); • 원소 B 삽입 : push(stack, B);

  33. 3.2.2스택의 운영 • 원소 C 삽입 :push(stack, C); • 원소 삭제 :pop(stack);

  34. 스택 활용 - 부프로그램 3.2.3스택의 활용 부프로그램 차후에 원상 복귀(return)시켜서 처리할 정보를 저장할 때 사용한다. 부프로그램을 호출하기 이전에 기억하고 있어야 할 내용을 스택에 저장한다. 스택에 저장된 자료는 호출한 프로그램으로 복귀하기 위한 주소이다.

  35. 3.2.3스택의 활용 • 시스템 스택 • 프로그램에서의 호출과 복귀에 따른 수행 순서를 관리 • 가장 마지막에 호출된 함수가 가장 먼저 실행을 완료하고 복귀하는 후입선출 구조의 스택을 이용하여 수행순서 관리 • 함수 호출이 발생하면 호출한 함수 수행에 필요한 지역변수, 매개변수 및 수행 후 복귀할 주소 등의 정보를 스택 프레임(stack frame)에 저장하여 시스템 스택에 삽입 • 함수의 실행이 끝나면 시스템 스택의 top 원소(스택 프레임)를 삭제(pop)하면서 프레임에 저장되어있던 복귀주소를 확인하고 복귀 • 함수 호출과 복귀에 따라 이 과정을 반복하여 전체 프로그램 수행이 종료되면 시스템스택은 공백 스택이 된다.

  36. 스택 활용 – 수식 계산 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+=가 되어 후위 표기로 변환한다. 중위 표기를 전위 표기로 변환하는 방법은 같은 방법으로 하되 연산자를 왼쪽 괄호 밖으로 옮기면 된다.

  37. 3.2.3스택의 운영 • 수식의 표기법 • 전위표기법(prefix notation) • 연산자를 앞에 표기하고 그 뒤에 피연산자를 표기하는 방법 • 예) +AB • 중위표기법(infix notation) • 연산자를 피연산자의 가운데 표기하는 방법 • 예) A+B • 후위표기법(postfix notation) • 연산자를 피연산자 뒤에 표기하는 방법 • 예) AB+

  38. 3.2.3스택의 운영 • 중위표기식의 전위표기식 변환 방법 • 예) A*B-C/D •  1단계: ( (A*B)-(C/D)) •  2단계:   ⇒ -(*(A B)/(C D)) •  3단계:  -*AB/CD ① 수식의 각 연산자에 대해서 우선순위에 따라 괄호를 사용하여 다시 표현한다. ② 각 연산자를 그에 대응하는 왼쪽괄호의 앞으로 이동시킨다. ③ 괄호를 제거한다.

  39. 3.2.3스택의 운영 • 중위표기식의 후위표기식 변환 방법 • 예) A*B-C/D •  1단계: ( (A*B)-(C/D)) •  2단계:   ⇒ ( (A B)*(C D)/ )- •  3단계:  AB*CD/- ① 수식의 각 연산자에 대해서 우선순위에 따라 괄호를 사용하여 다시 표현한다. ② 각 연산자를 그에 대응하는 오른쪽괄호의 뒤로 이동시킨다. ③ 괄호를 제거한다.

  40. 3.2.3스택의 운영 • 스택을 사용하여 입력된 중위표기식을 후위표기식으로 변환 • 변환 방법 • 왼쪽 괄호를 만나면 무시하고 다음 문자를 읽는다. • 피연산자를 만나면 출력한다. • 연산자를 만나면 스택에 push한다. • 오른쪽괄호를 만나면 스택을 pop하여 출력한다. • 수식이 끝나면, 스택이 공백이 될 때까지 pop하여 출력한다.

  41. 3.2.3스택의 운영 • 예) ((A*B)-(C/D))

  42. 3.2.3스택의 운영 • 예) ((A*B)-(C/D))

  43. 3.2.3스택의 운영 • 예) ((A*B)-(C/D))

  44. 3.2.3스택의 운영 • 예) ((A*B)-(C/D))

  45. 3.2.3스택의 운영 • 스택을 사용하여 후위표기식을 연산 • 연산 방법 • 수식이 끝나고 스택에 마지막으로 남아있는 원소는 전체 수식의 연산결과 값이 된다. • 피연산자를 만나면 스택에 push한다. • 연산자를 만나면 필요한 만큼의 피연산자를 스택에서 pop하여 연산하고, 연산결과를 다시 스택에 push한다. • 수식이 끝나면, 마지막으로 스택을 pop하여 출력한다.

  46. 3.2.3스택의 운영 • 예) AB*CD/-

  47. 3.2.3스택의 운영 • 예) AB*CD/-

  48. 3.2.3스택의 운영 • 예) AB*CD/-

  49. 예제 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+- =

  50. 예제 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-*=

More Related