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

Similar documents
슬라이드 1

Microsoft PowerPoint - 07-chap05-Stack.ppt

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

4장

Microsoft PowerPoint - ch08_큐 [호환 모드]

03장.스택.key

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

03장.스택

06장.리스트

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

untitled

chap 5: Trees

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

Chapter 4. LISTS

Algorithms

Chapter 06. 스택(Stack)

슬라이드 1

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

Algorithms

Chapter 4. LISTS

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

03_queue

chap01_time_complexity.key

PowerPoint 프레젠테이션

Chapter 4. LISTS

슬라이드 1

PowerPoint 프레젠테이션

q 이장에서다룰내용 1 연결자료구조방식 2 단순연결리스트 3 원형연결리스트 4 이중연결리스트 3 다항식의연결자료구조표현 2

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

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

<4D F736F F F696E74202D20C1A637C0E52DB0EDB1DEBFACB0E1B8AEBDBAC6AE2E >

PowerPoint Presentation

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

1장. 리스트

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

<4D F736F F F696E74202D20C0DAB7E1B1B8C1B65FC3E2BCAEBCF6BEF7>

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

슬라이드 1

Microsoft PowerPoint - 08-Queue.ppt

Microsoft PowerPoint - 08-chap06-Queue.ppt

05_tree

PowerPoint Presentation

chap x: G입력

2. QUEUE OPERATIONS Initialize the queue Insert to the rear of the queue (also called as Enqueue) Remove (Delete) from the front of the queue (also ca

11장 포인터

PowerPoint 프레젠테이션

중간고사 (자료 구조)

PowerPoint 프레젠테이션

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

<4D F736F F F696E74202D FBFACB0E120C0DAB7E1B1B8C1B6205BC8A3C8AF20B8F0B5E55D>

ABC 10장

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

PowerPoint Presentation

PowerPoint 프레젠테이션

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

슬라이드 1

11장 포인터

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

제 1 장 기본 개념

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

4장. 순차자료구조

Microsoft Word - FunctionCall

4장.문장

슬라이드 1

Microsoft PowerPoint - ch07 - 포인터 pm0415

7장

JAVA PROGRAMMING 실습 02. 표준 입출력

Microsoft PowerPoint - C++ 5 .pptx

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

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

C++ Programming

C 언어 강의노트

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

Microsoft PowerPoint - logo_3.ppt [호환 모드]

Microsoft PowerPoint - chap06-2pointer.ppt

chap x: G입력

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

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

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

슬라이드 1

슬라이드 1

슬라이드 1

Microsoft PowerPoint - Java7.pptx

JAVA PROGRAMMING 실습 08.다형성

Microsoft PowerPoint - 제11장 포인터

슬라이드 1

설계란 무엇인가?

Problem 1: 스택자료구조구현 (20 점 ) ( 목적 ) 이문제에서는프로그래밍시사용되는자료구조중하나인스택을직접구현해봄으로써, 구조체와포인터를익힌다. ( 스택의정의 ) 스택은쌓아올린더미를의미하며한쪽끝에서만삽입과삭제과일어나는자료구조이다. 즉, 스택구조는아이템을 Las

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

PowerPoint 프레젠테이션

설계란 무엇인가?

PowerPoint 프레젠테이션

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

슬라이드 1

02장.배열과 클래스

JVM 메모리구조

Chap 6: Graphs

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

PowerPoint Presentation

Java ...

Transcription:

스택 (Stack) 자바로배우는쉬운자료구조

이장에서다룰내용 1 스택 2 스택의추상자료형 3 스택의구현 4 스택의응용 2

스택 (1) 스택 (stack) 접시를쌓듯이자료를차곡차곡쌓아올린형태의자료구조 스택에저장된원소는 top 으로정한곳에서만접근가능 top 의위치에서만원소를삽입하므로먼저삽입한원소는밑에쌓이고, 나중에삽입한원소는위에쌓인다. 마지막에삽입 (Last-In) 한원소는맨위에쌓여있다가가장먼저삭제 (First-Out) 된다. 후입선출구조 (LIFO, Last-In-First-Out) 3

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

스택 (3) 후입선출구조의예2 : 슈퍼맨의옷갈아입기 수퍼맨이옷을벗는순서 1 장화 2망토 3빨간팬츠 4파란옷 슈퍼맨이옷을입는순서 4 파란옷 3빨간팬츠 2망토 1장화 5

스택 (4) 스택의연산 스택에서의삽입연산 : push 스택에서의삭제연산 : pop 6

스택 (5) 스택에서의원소삽입 / 삭제과정 공백스택에원소 A, B, C를순서대로삽입하고한번삭제하는동안의스택변화 7

추상자료형스택 (1) 스택에대한추상자료형 ADT Stack [ADT 7-1] 데이터 : 0개이상의원소를가진유한순서리스트연산 : S Stack; item Element; createstack() ::= create an empty Stack; // 공백스택을생성하는연산 isempty(s) ::= if (S is empty) then return true else return false; // 스택 S가공백인지아닌지를확인하는연산 push(s, item) ::=insert item onto the top of S; // 스택 S의 top에 item( 원소 ) 을삽입하는연산 pop(s) ::= if (isempty(s)) then return error else { delete and return the top item of S }; // 스택 S의 top에있는item( 원소 ) 을스택에서삭제하고반환하는연산 delete(s) ::= if (isempty(s)) then return error else delete the top item;a // 스택 S의 top에있는item( 원소 ) 을삭제하는연산 peek(s) ::= if (isempty(s)) then return error else return (the top item of the S); // 스택 S의 top에있는item( 원소 ) 을반환하는연산 End Stack 8

추상자료형스택 (2) 스택의 push 알고리즘 1 top top+1; 스택 S에서 top이마지막자료를가리키고있으므로그위에자료를삽입하려면먼저 top의위치를하나증가 만약이때 top 의위치가스택의크기 (stack_size) 보다크다면오버플로우 (overflow) 상태가되므로삽입연산을수행하지못하고연산종료 2 S(top) x; 오버플로우상태가아니라면스택의 top이가리키는위치에 x 삽입 push(s, x) top top+1; // ❶ if (top > stack_size) then overflow; else S(top) x; // ❷ end push( ) [ 알고리즘 7-1] 9

추상자료형스택 (3) 스택의 pop 알고리즘 1 return S(top); 스택이공백스택이아니라면 top 이가리키는원소를먼저반환 2 top top-1; 스택의 top 원소를반환하였으므로 top 의위치는그아래의원소로변경하기위해 top 의위치를하나감소 pop(s) if (top = 0) then error; else { return S(top); // ❶ top top-1; // ❷ } end pop() [ 알고리즘 7-2] 10

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

스택의구현 (2) 크기가 5 인 1 차원배열의스택에서 [ 그림 7-6] 의연산수행과정 12

스택의구현 (3) 순차자료구조방식을이용하여구현한스택프로그램 01 interface Stack{ 02 boolean isempty( ); 03 void push(char item); 04 char pop( ); 05 void delete( ); 06 char peek( ); 07 } 08 09 class ArrayStack implements Stack{ 10 private int top; 11 private int stacksize; 12 private char itemarray[]; 13 14 public ArrayStack(int stacksize){ 15 top = -1; 16 this.stacksize = stacksize; 17 itemarray = new char[this.stacksize]; 18 } [ 예제 7-1] 13

스택의구현 (4) 순차자료구조방식을이용하여구현한스택프로그램 19 [ 예제 7-1] 20 public boolean isempty(){ 21 return (top == -1); 22 } 23 24 public boolean isfull(){ 25 return (top == this.stacksize-1); 26 } 27 28 public void push(char item){ 29 if(isfull()){ 30 System.out.println("Inserting fail! Array Stack is full!!"); 31 } 32 else{ 33 itemarray[++top] = item; 34 System.out.println("Inserted Item : " + item); 35 } 36 } 14

스택의구현 (5) 순차자료구조방식을이용하여구현한스택프로그램 37 [ 예제 7-1] 38 public char pop(){ 39 if(isempty()) { 40 System.out.println("Deleting fail! Array Stack is empty!!"); 41 return 0; 42 } 43 else{ 44 return itemarray[top--]; 45 } 46 } 47 48 public void delete(){ 49 if(isempty()){ 50 System.out.println("Deleting fail! Array Stack is empty!!"); 51 } 52 else { 53 top--; 54 } 55 } 15

스택의구현 (6) 순차자료구조방식을이용하여구현한스택프로그램 56 [ 예제 7-1] 57 public char peek(){ 58 if(isempty()){ 59 System.out.println("Peeking fail! Array Stack is empty!!"); 60 return 0; 61 } 62 else 63 return itemarray[top]; 64 } 65 66 public void printstack(){ 67 if(isempty()) 68 System.out.printf("Array Stack is empty!! %n %n"); 69 else{ 70 System.out.printf("Array Stack>> "); 71 for(int i=0; i<=top; i++) 72 System.out.printf("%c ", itemarray[i]); 73 System.out.println(); System.out.println(); 74 } 16

스택의구현 (7) 순차자료구조방식을이용하여구현한스택프로그램 75 } 76 } 77 78 class Ex7_1{ 79 public static void main(string args[]){ 80 int stacksize = 5; 81 char deleteditem; 82 ArrayStack S = new ArrayStack(stackSize); 83 84 S.push('A'); 85 S.printStack( ); 86 87 S.push('B'); 88 S.printStack(); 89 90 S.push('C'); 91 S.printStack( ); [ 예제 7-1] 17

스택의구현 (8) 순차자료구조방식을이용하여구현한스택프로그램 92 [ 예제 7-1] 93 deleteditem = S.pop(); 94 if(deleteditem!= 0) 95 System.out.println("deleted Item : " + deleteditem); 96 S.printStack(); 97 } 98 } 18

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

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

스택의구현 (11) 단순연결리스트의스택에서 [ 그림 6-6] 의연산수행과정 1 공백스택생성 :create(stack); 2 원소 A 삽입 :push(stack, A); 3 원소 B 삽입 :push(stack, B); 21

스택의구현 (12) 4 원소 C 삽입 :push(stack, C); 5 원소삭제 :pop(stack); 22

스택의구현 (13) 연결자료구조방식을이용하여구현한스택프로그램 01 interface Stack{ 02 boolean isempty(); 03 void push(char item); 04 char pop(); 05 void delete(); 06 char peek(); 07 } 08 09 class StackNode{ 10 char data; 11 StackNode link; 12 } 13 14 class LinkedStack implements Stack{ 15 private StackNode top; 16 17 public boolean isempty(){ [ 예제 7-2] 23

스택의구현 (14) 연결자료구조방식을이용하여구현한스택프로그램 18 return (top == null); [ 예제 7-2] 19 } 20 21 public void push(char item){ 22 StackNode newnode = new StackNode(); 23 newnode.data = item; 24 newnode.link = top; 25 top = newnode; 26 System.out.println("Inserted Item : " + item); 27 } 28 29 public char pop(){ 30 if(isempty()) { 31 System.out.println("Deleting fail! Linked Stack is empty!!"); 32 return 0; 33 } 34 else{ 35 char item = top.data; 36 top = top.link; 24

스택의구현 (15) 연결자료구조방식을이용하여구현한스택프로그램 37 return item; [ 예제 7-2] 38 } 39 } 40 41 public void delete(){ 42 if(isempty()){ 43 System.out.println("Deleting fail! Linked Stack is empty!!"); 44 45 } 46 else { 47 top = top.link; 48 } 49 } 50 51 public char peek(){ 51 if(isempty()){ 52 System.out.println("Peeking fail! Linked Stack is empty!!"); 25

스택의구현 (16) 연결자료구조방식을이용하여구현한스택프로그램 53 return 0; 54 } 55 else 56 return top.data; 57 } 58 59 public void printstack(){ 60 if(isempty()) 61 System.out.printf("Linked Stack is empty!! %n %n"); 62 else{ 63 StackNode temp = top; 64 System.out.println("Linked Stack>> "); 65 while(temp!= null){ 66 System.out.printf("\t %c \n", temp.data); 67 temp = temp.link; 68 } 69 System.out.println(); 70 } [ 예제 7-2] 26

스택의구현 (17) 연결자료구조방식을이용하여구현한스택프로그램 71 } 72 } 73 74 class Ex7_2{ 75 public static void main(string args[]){ 76 char deleteditem; 77 LinkedStack LS = new LinkedStack(); 78 79 LS.push('A'); 80 LS.printStack(); 81 82 LS.push('B'); 83 LS.printStack(); 84 85 LS.push('C'); 86 LS.printStack(); 87 [ 예제 7-2] 27

스택의구현 (18) 연결자료구조방식을이용하여구현한스택프로그램 88 deleteditem = LS.pop(); [ 예제 7-2] 89 if(deleteditem!= 0) 90 System.out.println("deleted Item : " + deleteditem); 91 LS.printStack(); 92 } 93 } 28

스택의응용 (1) 역순문자열만들기 역순문자열만들기 스택의후입선출 (LIFO) 성질을이용 1 문자열을순서대로스택에 push 하기 29

스택의응용 (1) 역순문자열만들기 2 스택을 pop 하여문자열로저장하기 30

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

스택의응용 (2) 시스템스택 함수호출과복귀에따른전체프로그램의수행순서 32

스택의응용 (2) 시스템스택 1 프로그램이실행을시작하여 main() 함수가실행되면서 main() 함수에관련된정보를스택프레임에저장하여시스템스택에삽입 2 main() 함수실행중에 F_1() 함수호출을만나면함수호출과복귀에필요한정보를스택프레임에저장하여시스템스택에삽입하고, 호출된함수인 F_1() 함수로이동 이때스택프레임에는호출된함수의수행이끝나고 main() 함수로복귀할주소 a 를저장 33

스택의응용 (2) 시스템스택 3 호출된함수 F_1() 함수를실행 4 F_1() 함수실행중에 F_2() 함수호출을만나면다시함수호출과복귀에필요한정보를스택프레임에저장하여시스템스택에삽입. 호출된함수인 F_2() 함수를실행 스택프레임에는 F_1() 함수로복귀할주소 b 를저장 5 호출된함수 F_2() 함수를실행완료 6 시스템스택의 top 에있는스택프레임을 pop 하여정보를확인하고, F_1() 함수의 b 주소로복귀 34

스택의응용 (2) 시스템스택 7 복귀된함수 F_1() 함수의 b 주소이후부분을실행 8 시스템스택의 top 에있는스택프레임을 pop 하여정보를확인하고 main() 함수의 a 주소로복귀 9 복귀된 main() 함수의 a 주소이후부분에대한실행이완료되면시스템스택의 top 에있는스택프레임을 pop 하는데, 시스템스택이공백이되었으므로전체프로그램실행종료 35

스택의응용 (3) 수식의괄호검사 수식의괄호검사 수식에포함되어있는괄호는가장마지막에열린괄호를가장먼저닫아주어야하는후입선출구조로구성되어있으므로, 후입선출구조의스택을이용하여괄호를검사한다. 수식을왼쪽에서오른쪽으로하나씩읽으면서괄호검사 왼쪽괄호를만나면스택에 push 오른쪽괄호를만나면스택을 pop하여마지막에저장한괄호와같은종류인지를확인 같은종류의괄호가아닌경우괄호의짝이잘못사용된수식! 수식에대한검사가모두끝났을때스택은공백스택 수식이끝났어도스택이공백이되지않으면괄호의개수가틀린수식! 36

스택의응용 (3) 수식의괄호검사 수식의괄호검사알고리즘 testpair( ) exp Expression; Stack null; while (true) do { symbol getsymbol(exp); case { symbol = "(" or "[" or "{" : push(stack, symbol); symbol = ")" : open_pair pop(stack); if (open_pair "(") then return false; symbol = "]" : open_pair pop(stack); if (open_pair "[") then return false; symbol = "}" : open_pair pop(stack); if (open_pair "{") then return false; [ 알고리즘 7-3] 37

스택의응용 (3) 수식의괄호검사 수식의괄호검사알고리즘 symbol = null : if (isempty(stack)) then return true; else return false; else : } } end testpair( ) [ 알고리즘 7-3] 38

스택의응용 (3) 수식의괄호검사 수식의괄호검사예 검사할수식 : {(A+B)-3}*5+[{cos(x+y)+7}-1]*4 >> 계속 39

스택의응용 (3) 수식의괄호검사 >> 계속 40

스택의응용 (3) 수식의괄호검사 41

스택의응용 (3) 수식의괄호검사 42

스택의응용 (3) 수식의괄호검사 연결자료구조방식을이용하여구현한스택프로그램 001 interface Stack{ 002 boolean isempty( ); 003 void push(char item); 004 char pop( ); 005 void delete( ); 006 char peek( ); 007 } 008 009 class StackNode{ 010 char data; 011 StackNode link; 012 } 013 014 class LinkedStack implements Stack{ 015 private StackNode top; 016 017 public boolean isempty(){ 018 return (top == null); 019 } [ 예제 7-3] 43

스택의응용 (3) 수식의괄호검사 연결자료구조방식을이용하여구현한스택프로그램 020 [ 예제 7-3] 021 public void push(char item){ 022 StackNode newnode = new StackNode(); 023 newnode.data = item; 024 newnode.link = top; 025 top = newnode; 026 // System.out.println("Inserted Item : " + item); 027 } 028 029 public char pop(){ 030 if(isempty()) { 031 System.out.println("Deleting fail! Linked Stack is empty!!"); 032 return 0; 033 } 034 else{ 035 char item = top.data; 036 top = top.link; 037 return item; 038 } 44

스택의응용 (3) 수식의괄호검사 연결자료구조방식을이용하여구현한스택프로그램 039 } [ 예제 7-3] 040 041 public void delete(){ 042 if(isempty()){ 043 System.out.println("Deleting fail! Linked Stack is empty!!"); 044 045 } 046 else { 047 top = top.link; 048 } 049 } 050 051 public char peek(){ 052 if(isempty()){ 053 System.out.println("Peeking fail! Linked Stack is empty!!"); 054 return 0; 055 } 056 else 057 return top.data; 45

스택의응용 (3) 수식의괄호검사 연결자료구조방식을이용하여구현한스택프로그램 058 } [ 예제 7-3] 059 060 public void printstack(){ 061 if(isempty()) 062 System.out.printf("Linked Stack is empty!! %n %n"); 063 else{ 064 StackNode temp = top; 065 System.out.println("Linked Stack>> "); 066 while(temp!= null){ 067 System.out.printf("\t %c \n", temp.data); 068 temp = temp.link; 069 } 070 System.out.println(); 071 } 072 } 073 } 074 46

스택의응용 (3) 수식의괄호검사 연결자료구조방식을이용하여구현한스택프로그램 075 class OptExp{ 076 private String exp; 077 private int expsize; 078 private char testch, openpair; 079 080 public boolean testpair(string exp){ 081 this.exp = exp; 082 LinkedStack S = new LinkedStack(); 083 expsize = this.exp.length(); 084 for(int i=0; i<expsize; i++){ 085 testch = this.exp.charat(i); 086 switch(testch){ 087 case '(' : 088 case '{' : 089 case '[' : 090 S.push(testCh); break; 091 case ')' : 092 case '}' : [ 예제 7-3] 47

스택의응용 (3) 수식의괄호검사 연결자료구조방식을이용하여구현한스택프로그램 093 case ']' : 094 if(s.isempty()) return false; 095 else{ 096 openpair = S.pop(); 097 if((openpair == '(' && testch!= ')') 098 (openpair == '{' && testch!= '}') 099 (openpair == '[' && testch!= ']')) 100 return false; 101 else break; 102 } 103 } 104 } 105 if (S.isEmpty()) return true; 106 else return false; 107 } 108 109 public char[] topostfix(string infix){ 110 char testch; [ 예제 7-3] 48

스택의응용 (3) 수식의괄호검사 연결자료구조방식을이용하여구현한스택프로그램 111 exp = infix; 112 int expsize = 10; 113 int j=0; 114 char postfix[] = new char[expsize]; 115 LinkedStack S = new LinkedStack(); 116 117 for(int i=0; i<=expsize; i++){ 118 testch = this.exp.charat(i); 119 switch(testch){ 120 case '0': 121 case '1': 122 case '2': 123 case '3': 124 case '4': 125 case '5': 126 case '6': 127 case '7': 128 case '8': [ 예제 7-3] 49

스택의응용 (3) 수식의괄호검사 연결자료구조방식을이용하여구현한스택프로그램 129 case '9': 130 postfix[j++] = testch; break; 131 132 case '+' : 133 case '-' : 134 case '*' : 135 case '/' : 136 S.push(testCh); break; 137 138 case ')' : postfix[j++] =S.pop(); break; 139 140 141 default: 142 } 143 } 144 postfix[j] = S.pop(); 145 return postfix; 146 } 147 } [ 예제 7-3] 50

스택의응용 (3) 수식의괄호검사 연결자료구조방식을이용하여구현한스택프로그램 148 149 class Ex7_3{ 150 public static void main(string args[]){ 151 OptExp opt = new OptExp(); 152 String exp = "(3*5)-(6/2)"; 153 char postfix[]; 154 int value; 155 System.out.println(exp); 156 if(opt.testpair(exp)) 157 System.out.println(" 괄호맞음!"); 158 else 159 System.out.println(" 괄호틀림!!!"); 160 161 System.out.printf("\n후위표기식 : "); 162 postfix = opt.topostfix(exp); 163 System.out.println(postfix); 164 } 165 } [ 예제 7-3] 51

스택의응용 (3) 수식의괄호검사 실행결과 52

스택의응용 (4) 수식변환 수식의표기법 전위표기법 (prefix notation) 연산자를앞에표기하고그뒤에피연산자를표기하는방법 예 ) +AB 중위표기법 (infix notation) 연산자를피연산자의가운데표기하는방법 예 ) A+B 후위표기법 (postfix notation) 연산자를피연산자뒤에표기하는방법 예 ) AB+ 53

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

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

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

스택의응용 (4) 수식변환 예 ) ((A*B)-(C/D)) 57

스택의응용 (4) 수식변환 예 ) ((A*B)-(C/D)) 58

스택의응용 (4) 수식변환 예 ) ((A*B)-(C/D)) 59

스택의응용 (4) 수식변환 예 ) ((A*B)-(C/D)) 60

예 ) (a+b)*c ( a + b ) * c ( 61

예 ) (a+b)*c ( a + b ) * c ( 62

예 ) (a+b)*c ( a + b ) * c a ( 63

예 ) (a+b)*c ( a + b ) * c + a ( 64

예 ) (a+b)*c ( a + b ) * c + a b ( 65

예 ) (a+b)*c ( a + b ) * c a b + 66

예 ) (a+b)*c ( a + b ) * c a b + * 67

예 ) (a+b)*c ( a + b ) * c a b + c * 68

예 ) (a+b)*c ( a + b ) * c a b + c * 69

스택의응용 (4) 수식변환 중위표기법에대한후위표기법변환알고리즘 infix_to_postfix(exp) while(true) do { symbol getsymbol(exp); case { symbol = operand : // 피연산자처리 print(symbol); symbol = operator : // 연산자처리 push(stack, symbol); symbol = ")" : // 오른쪽괄호처리 print(pop(stack)); symbol = null : // 중위수식의끝 while(top > -1) do print(pop(stack)); else : } } end infix_to_postfix( ) [ 알고리즘 7-4] 70

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

스택의응용 (5) 후위표기식연산 8 2 / 3-3 2 8 2 / 3-3 2 8 2 / 3-3 2 1 1 2 1 0 8 0 8 0 4 피연산자 -> 삽입피연산자 -> 삽입연산자 -> 8/2=4 삽입 8 2 / 3-3 2 8 2 / 3-3 2 8 2 / 3-3 2 1 3 1 1 0 4 0 1 0 1 피연산자 -> 삽입연산자 -> 4-1=1 삽입종료 -> 전체연산결과 =1 72

스택의응용 (5) 후위표기식연산 후위표기수식의연산알고리즘 evalpostfix(exp) while (true) do { symbol getsymbol(exp); case { symbol = operand : // 피연산자처리 push(stack, symbol); symbol = operator : // 연산자처리 opr2 pop(stack); opr1 pop(stack); result opr1 op(symbol) opr2; // 스택에서꺼낸피연산자들을연산자로연산 push(stack, result); symbol = null : // 후위수식의끝 print(pop(stack)); } } end evalpostfix() [ 알고리즘 7-5] 73

스택의응용 (5) 후위표기식연산 예 ) AB*CD/- 74

스택의응용 (5) 후위표기식연산 예 ) AB*CD/- 75

스택의응용 (5) 후위표기식연산 예 ) AB*CD/- 76

스택의응용 (5) 후위표기식연산 후위표기수식의연산프로그램 01 class StackNode{ 02 int data; 03 StackNode link; 04 } 05 06 class LinkedStack{ 07 private StackNode top; 08 09 public boolean isempty(){ 10 return (top == null); 11 } 12 13 public void push(int item){ 14 StackNode newnode = new StackNode(); 15 newnode.data = item; 16 newnode.link = top; 17 top = newnode; 18 } 19 [ 예제 7-4] 77

스택의응용 (5) 후위표기식연산 후위표기수식의연산프로그램 20 public int pop(){ [ 예제 7-4] 21 if(isempty()) { 22 System.out.println("Deleting fail! Linked Stack is empty!!"); 23 return 0; 24 } 25 else{ 26 int item = top.data; 27 top = top.link; 28 return item; 29 } 30 } 31 } 32 33 class OptExp2{ 34 private String exp; 35 36 public int evalpostfix(string postfix){ 37 LinkedStack S = new LinkedStack(); 38 exp = postfix; 78

스택의응용 (5) 후위표기식연산 후위표기수식의연산프로그램 39 int opr1, opr2, value; [ 예제 7-4] 40 char testch; 41 for(int i=0; i<7; i++){ 42 testch = exp.charat(i); 43 if(testch!= '+' && testch!= '-' && testch!='*' && testch!= '/'){ 44 value = testch - '0';45 S.push(value); 46 } 47 else{ 48 opr2 = S.pop(); 49 opr1 = S.pop(); 50 switch(testch){ 51 case '+' : S.push(opr1 + opr2); break; 52 case '-' : S.push(opr1 - opr2); break; 53 case '*' : S.push(opr1 * opr2); break; 54 case '/' : S.push(opr1 / opr2); break; 55 } 56 } 57 } 58 return S.pop(); 79

스택의응용 (5) 후위표기식연산 후위표기수식의연산프로그램 59 } 60 } 61 62 class Ex7_4{ 63 public static void main(string args[]){ 64 OptExp2 opt = new OptExp2(); 65 int result; 66 String exp = "35*62/-"; 67 System.out.printf("\n후위표기식 : %s", exp); 68 result = opt.evalpostfix(exp); 69 System.out.printf("\n 연산결과 = %d \n", result); 70 } 71 } [ 예제 7-4] 80

스택의응용 (6) 미로탐색 체계적인방법필요 현재의위치에서가능한방향을스택에저장해놓았다가막다른길을만나면스택에서다음탐색위치를꺼낸다 1 1 1 1 1 1 1 1 1 1 입구 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 1 0 1 1 1 0 0 1 0 1 1 0 0 0 1 0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 출구 1 0 1 0 1 m 0 1 0 1 1 0 1 0 0 0 0 1 0 x 1 1 1 1 1 1 1 1 1 1 81

스택의응용 (6) 미로탐색 82

스택의응용 (6) 미로탐색 미로탐색알고리즘 스택 s과출구의위치 x, 현재생쥐의위치를초기화 while( 현재의위치가출구가아니면 ) do 현재위치를방문한것으로표기 if( 현재위치의위, 아래, 왼쪽, 오른쪽위치가아직방문되지않았고갈수있으면 ) then 그위치들을스택에 push if( is_empty(s) ) then 실패 else 스택에서하나의위치를꺼내어현재위치로만든다 ; 성공 ; 83

자바로배우는쉬운자료구조 7 장끝