03장.스택

Similar documents
03장.스택.key

Microsoft PowerPoint - 07-chap05-Stack.ppt

슬라이드 1

5.스택(강의자료).key

4장

o 스택 (stack) ~ 쌓아놓은더미 1. 스택의개요 - 2 -

06장.리스트

Microsoft PowerPoint - 제5장-스택의응용.pptx

untitled

Microsoft PowerPoint - ch07_스택 [호환 모드]

untitled

04장.큐

Chapter 4. LISTS

02장.배열과 클래스

리스트 (list), 선형리스트 (linear list): 순서를가진항목들의모임 집합 : 항목간의순서의개념이없음 L = n ( item0, item1,..., item -1) l 리스트의예 l 요일 : ( 일요일, 월요일,, 토요일 ) l 한글자음의모임 : ( ㄱ, ㄴ

1장. 리스트

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Chapter 06. 스택(Stack)

슬라이드 1

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

05_tree

K&R2 Reference Manual 번역본

금오공대 컴퓨터공학전공 강의자료

Chapter 4. LISTS

PowerPoint 프레젠테이션

chap x: G입력

Microsoft PowerPoint - 08-chap06-Queue.ppt

chap 5: Trees

Microsoft PowerPoint - 08-Queue.ppt

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

Microsoft PowerPoint - chap05-제어문.pptx

11장 포인터

chap x: G입력

슬라이드 1

03_queue

Microsoft PowerPoint - 제4장-스택과큐.pptx

; struct point p[10] = {{1, 2, {5, -3, {-3, 5, {-6, -2, {2, 2, {-3, -3, {-9, 2, {7, 8, {-6, 4, {8, -5; for (i = 0; i < 10; i++){ if (p[i].x > 0 && p[i

슬라이드 1

슬라이드 1

Lab 3. 실습문제 (Single linked list)_해답.hwp


OCW_C언어 기초

Microsoft PowerPoint - chap04-연산자.pptx

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

기초컴퓨터프로그래밍

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

중간고사

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

C 언어 프로그래밊 과제 풀이

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

7장

Microsoft PowerPoint - Chapter_08.pptx

Microsoft PowerPoint - chap11-포인터의활용.pptx

Microsoft PowerPoint - chap10-함수의활용.pptx

Microsoft PowerPoint - chap06-2pointer.ppt

untitled

본 강의에 들어가기 전

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

08장.트리

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

중간고사 (자료 구조)

11장 포인터

Microsoft PowerPoint - chap12-고급기능.pptx

C 프로그래밊 개요

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

C++ Programming

원형연결리스트에대한설명중틀린것은 모든노드들이연결되어있다 마지막에삽입하기가간단한다 헤더노드를가질수있다 최종노드포인터가 NULL이다 리스트의 번째요소를가장빠르게찾을수있는구현방법은무엇인가 배열 단순연결리스트 원형연결리스트 이중연결리스트 단순연결리스트의노드포인터 가마지막노드를

Data structure: Assignment 1 Seung-Hoon Na October 1, Assignment 1 Binary search 주어진 정렬된 입력 파일이 있다고 가정하자. 단, 파일내의 숫자는 공백으로 구 분, file내에 숫자들은

Microsoft PowerPoint - chap06-1Array.ppt

슬라이드 1

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

Microsoft PowerPoint - ch07 - 포인터 pm0415

Lab 5. 실습문제 (Double linked list)-1_해답.hwp

Chapter 4. LISTS

Contents v 학습목표 자료구조큐에대한개념을스택과비교하여이해한다. 큐의특징과연산방법에대해알아본다. 순차표현방법을이용한큐와연결표현방법을이용한큐를구현해본다. 큐의응용방법을알아본다. v 내용 큐 큐의구현 큐의응용 2/74

untitled

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터

PowerPoint 프레젠테이션

컴파일러

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

Data Structure

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

데이터구조 (Chapter 3: Stacks and Queues) 2011 년봄학기 숙명여자대학교이과대학멀티미디어과학과박영호

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

C프로-3장c03逞풚

chap x: G입력

Microsoft PowerPoint - C++ 5 .pptx

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

Microsoft PowerPoint - 제11장 포인터(강의)

Microsoft PowerPoint - [2009] 02.pptx

Chap 6: Graphs

untitled

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

ABC 10장

Microsoft Word - FunctionCall

Transcription:

---------------- DT STRUCTURES USING C ---------------- CHPTER 스택 1/30

스택이란? 스택 (stack): 쌓아놓은더미 후입선출 (LIFO:Last-In First-Out) 가장최근에들어온데이터가가장먼저나감 2/30

스택의구조 스택상단 : top 스택하단 : 불필요 요소, 항목 공백상태, 포화상태 삽입, 삭제연산 3/30

스택추상자료형 객체 : 무엇이든가능 ( 닦은접시들 ) 연산 ( 접시함의경우 ) 닦은접시를보관함에넣음 -> 새로운항목을스택에삽입 보관함에서접시하나를꺼냄 -> 하나의항목을꺼냄. 보관함에접시가있는지살핌 -> 스택이비어있는지살핌 고급접시함 고급기능추가 접시를꺼내지않고맨위의접시가무엇인지알아본다. 보관함이가득차있는지를살핀다. 보관함내의접시개수를알려준다. 보관함내에어떤접시가있는지모니터에출력해준다. 4/30

스택추상자료형 Stack DT 데이터 : 후입선출 (LIFO) 의접근방법을유지하는요소들의모음 연산 : init(): 스택을초기화한다. is_empty(): 스택이비어있으면 TRUE를아니면 FLSE를반환한다. is_full(): 스택이가득차있으면 TRUE를아니면 FLSE을반환한다. size(): 스택내의모든요소들의개수를반환한다. push(x): 주어진요소 x를스택의맨위에추가한다. pop(): 스택맨위에있는요소를삭제하고반환한다. peek(): 스택맨위에있는요소를삭제하지않고반환한다. 5/30

스택의연산 삽입 (push), 삭제 (pop) C push() push(b) push(c) C pop() B B B 초기상태 is_empty(): 스택이공백상태인지검사 is_full(): 스택이포화상태인지검사 peek(s): 요소를스택에서삭제하지않고보기만하는연산 ( 참고 ) pop 연산은요소를스택에서완전히삭제하면서가져옴. 6/30

스택의용도 함수호출 Undo기능 괄호검사 계산기 미로탐색등 7/30

배열을이용한스택의구현 1 차원배열 stack[ ] top: 가장최근에입력되었던자료를가리키는변수 stack[0] stack[top]: 먼저들어온순으로저장 공백상태이면 top은 -1 data[mx_stck_size] data[4] 4 4 E top data[3] 3 3 D data[2] C top 2 1 2 1 C B data[1] B 0 0 data[0] -1 공백상태 top -1 포화상태 8/30

Push 연산 C 4 4 3 3 2 2 C top 1 B top 1 B 0 0 push(x) if is_full(s) then error "overflow" else top top+1 data[top] x 9/30

Pop 연산 4 4 3 3 2 C top 2 1 B 1 B top 0 0 pop() if is_empty() then error "underflow" else e data[top] top top-1 return e 10/30

스택의구현 데이터 data[] top 전역변수로선언 typedef int Element; Element data[mx_stck_size]; int top; int is_empty() { if( top == -1 ) return 1; else return 0; 간단한함수 void init_stack() { top = -1; int size() { return top+1; int is_empty() { return (top == -1); int is_full() { return (top == MX_STCK_SIZE-1); 11/30

스택의주요함수 void push ( Element e ) { if( is_full() ) error (" 스택포화에러 "); data[++top] = e; Element pop ( ) { if( is_empty() ) error (" 스택공백에러 "); return data[top--]; Element peek ( ) { if( is_empty() ) error (" 스택공백에러 "); return data[top]; void print_stack(char msg[]) { int i; printf("%s[%2d]= ", msg, size()) ; for (i=0 ; i<size() ; i++ ) printf("%2d ", data[i]); printf("\n"); 12/30

사용방법 void main() { int i; init_stack(); for( i=1 ; i<10 ; i++ ) push( i ); print_stack(" 스택 push 9 회 "); printf("\tpop() --> %d\n", pop()); printf("\tpop() --> %d\n", pop()); printf("\tpop() --> %d\n", pop()); print_stack(" 스택 pop 3 회 "); 9 번 push() 연산후 3 번 pop() 연산후 설명출력현재항목수스택내용 13/30

구조체를저장하는스택 학생정보스택 구조체정의 Element 정의 typedef struct Student_t { int id; char name[32]; char dept[32]; Student; 출력함수수정 typedef Student Element; void print_stack(char msg[]) { int i; printf("%s[%2d]= ", msg, size()) ; for (i=0 ; i<size() ; i++ ) printf("\n\t%-15d %-10s %-20s", data[i].id, data[i].name, data[i].dept); printf("\n"); 14/30

학생정보스택프로그램 Student get_student(int id, char* name, char* dept) { Student s; s.id = id; strcpy(s.name, name); strcpy(s.dept, dept); return s; void main() { init_stack( ); push( get_student(2015130007, " 홍길동 ", " 컴퓨터공학과 ") ); push( get_student(2015130100, " 이순신 ", " 기계공학과 ") ); push( get_student(2015130135, " 김연아 ", " 체육과 ") ); push( get_student(2015130135, " 황희 ", " 법학과 ") ); print_stack(" 친구 4 명삽입후 "); pop( ); print_stack(" 친구 1 명삭제후 "); 15/30

스택구현의다른방법 연결리스트를이용하는방법 16/30

스택응용 : 괄호검사 괄호의종류 : 대중소 ( [, ] ), ( {, ), ( (, ) ) 조건 왼쪽괄호의개수와오른쪽괄호의개수가같아야한다. 왼쪽괄호는오른쪽괄호보다먼저나와야한다. 괄호사이에는포함관계만존재한다. 잘못된괄호사용의예 (a(b) a(b)c) a{b(c[d]ef) 17/30

괄호검사예 { [ (i+1 ) ]=0; 비교 비교 비교 [ { ( 성공 ( [ [ [ { { { { { if( ( i==0 ) && (j==0 ) [ ( i+1 ] ) =0; 비교 비교 비교 오류 ( ( 오류 ( ( ( ( ( ( ( ( ( ( [ [ ( 18/30

괄호검사알고리즘 알고리즘의개요 문자열에있는괄호를차례대로조사하면서왼쪽괄호를만나면스택에삽입하고, 오른쪽괄호를만나면스택에서 top 괄호를삭제한후오른쪽괄호와짝이맞는지를검사한다. 이때, 스택이비어있으면조건 1 또는조건 2 등을위배하게되고괄호의짝이맞지않으면조건 3 등에위배된다. 마지막괄호까지를조사한후에도스택에괄호가남아있으면조건 1 에위배되므로 0( 거짓 ) 을반환하고, 그렇지않으면 1( 참 ) 을반환한다. 19/30

괄호검사알고리즘 check_matching(expr) while ( 입력 expr 의끝이아니면 ) ch expr 의다음글자 switch(ch) case '(': case '[': case '{': ch 를스택에삽입 break case ')': case ']': case ']': if ( 스택이비어있으면 ) then 오류 else 스택에서 open_ch 를꺼낸다 if (ch 와 open_ch 가같은짝이아니면 ) break then 오류보고 if( 스택이비어있지않으면 ) then 오류 왼쪽괄호이면스택에삽입 오른쪽괄호이면스택에서삭제비교 20/30

괄호검사테스트프로그램 void main() { char expr[4][80] = { "{[(i+1)]=0;", "if((i==0) && (j==0)", "[(i+1])=0;", "[i] =f)(;" ; int err, i; for( i=0 ; i<4 ; i++ ) { err = check_matching(expr[i]); if( err == 0 ) printf(" 괄호정상 : %s\n", expr[i]); else printf(" 괄호오류 : %s ( 조건 %d 위반 )\n", expr[i], err); 21/30

수식의계산 수식의표기방법 : 전위 (prefix), 중위 (infix), 후위 (postfix) 중위표기법 전위표기법 후위표기법 2+3*4 +2*34 234*+ a*b+5 +5*ab ab*5+ (1+2)+7 +7+12 12+7+ 컴퓨터에서의수식계산순서 중위표기식-> 후위표기식-> 계산 2+3*4 -> 234*+ -> 14 모두스택을사용 22/30

후위표기수식계산 알고리즘 Calc_postfix (expr) 스택초기화 ; for 항목 in expr do if ( 항목이피연산자이면 ) s.push(item); if ( 항목이연산자 op 이면 ) then second pop(); result pop(); first pop(); temp first op second; // op 는 +-*/ 중의하나 push(temp); 23/30

후위표기수식계산예 후위표기수식 : 8 2 / 3-3 2 * + 8 2 8 / 2 = 4 3 2 8 8 8 4 3 4 피연산자 8 -> push( 8) 피연산자 2 -> push( 2) 연산자 / pop( ) ->2 pop( ) ->8 8/ 2 = 4 push( 4) 피연산자 3 -> push( 3) 후위표기수식 : 8 2 / 3-3 2 * + 4-3 = 1 3 2 * + 2 3 3 6 4 1 1 1 1 7 연산자 - pop( ) ->3 pop( ) ->4 4-3 = 1 push( 1) 피연산자 3 push( 3) 피연산자 2 push( 2) 연산자 * push( 3*2) 연산자 + push( 1+6) 24/30

후위표기수식계산프로그램 double calc_postfix( char expr[] ) {... init_stack( ); while( expr[i]!= '\0' ) { c = expr[i++]; if (c>='0' && c<='9') { val = c - '0'; push( val ); else if( c=='+' c=='-' c=='*' c=='/' ){... switch( c ) { case '+': push( val1 + val2); break;... void main() { char expr[2][80] = { "8 2 / 3-3 2 * +", "1 2 / 4 * 1 4 / *" ; printf(" 수식 : %s = %lf\n", expr[0], calc_postfix(expr[0])); printf(" 수식 : %s = %lf\n", expr[1], calc_postfix(expr[1])); 계산결과 25/30

중위표기수식의후위표기변환 중위표기와후위표기 중위와후위표기법의공통점 : 피연산자의순서가동일 연산자들의순서만다름 ( 우선순위순서 ) 알고리즘 연산자만스택에저장했다가출력 2+3*4 -> 234*+ 피연산자를만나면그대로출력 연산자를만나면스택에저장했다가스택보다우선순위가낮은연산자가나오면그때출력 왼쪽괄호는우선순위가가장낮은연산자로취급 오른쪽괄호가나오면스택에서왼쪽괄호위에쌓여있는모든연산자를출력 26/30

중위 후위표기변환예 중위표기수식 연산자스택 후위표기수식 중위표기수식 연산자스택 후위표기수식 + B * C * B + C + B * C * B + C + B * C * B + C + * + B * C B * B + C B + * + B * C 연산자우선순위비교 ( * > +) * 를바로삽입 * + B * B + C 연산자우선순위비교 ( +<= *) 우선순위가같거나높은 * 를먼저출력후 + 삽입 + B * + B * C * + B C * B + C + B * C + B * C B C * + * B + C B * C + 27/30

후위표기변환예 중위표기수식 ( + B ) * C 연산자스택 후위표기수식 ( + B ) * C 괄호는일단삽입 ( ( + B ) * C ( + B ) * C + ( 괄호는우선순위가가장낮음 ->+ 삽입 ( + B ) * C + B ( ( + B ) * C B + ) 가나오면 ( 전까지모두출력괄호는후위표기식에출력하지않음 ( ( + B ) * C B * ( + B ) * C B * + + C ( + B ) * C B + C * 28/30

후위표기변환알고리즘 Infix_to_postfix(expr) 스택초기화. while (expr 에처리할항이남아있으면 ) term 다음에처리할항 ; switch (term) case 피연산자 : term 을출력 ; break; case 왼쪽괄호 : push(term); break; case 오른쪽괄호 : e pop(); while( e 왼쪽괄호 ) do e 를출력 ; break; e pop(); case 연산자 : while ( peek() 의우선순위 term 의우선순위 ) do e pop(); e 를출력 ; push(term); break; while( not is_empty() ) do e pop(); e 를출력 ; 29/30

후위표기변환프로그램 static int precedence( char op ) { switch (op) { case '(' : case ')' : return 0; case '+' : case '-' : return 1; case '*' : case '/' : return 2; return -1; void infix_to_postfix( char expr[] ) {... void main() { char expr[2][80] = { "8/2-3+(3*2)", "1/2* 4 * (1/4)" ; printf(" 중위수식 : %s ==> 후위수식 :", expr[0]); infix_to_postfix(expr[0]); printf(" 중위수식 : %s ==> 후위수식 :", expr[1]); infix_to_postfix(expr[1]); 후위표기변환결과 30/30