7 스택.

Slides:



Advertisements
Similar presentations
멘토링 2 주차 장 프로그래밍을 위한 자바의 자료형  값이 변하지 않는 상수  메모리 기억공간인 변수.
Advertisements

명품 JAVA Programming 제 3 장 반복문, 배열, 예외처리.
스택 스택 추상자료형 스택 스택의 구현 스택의 응용 한빛미디어(주).
어서와 Java는 처음이지! 제3장선택과 반복.
어서와 Java는 처음이지! 제2장 자바 프로그래밍 기초.
10. 예외 처리.
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
IntArray[0] int length 5 intArray 객체 제 3 장 반복문, 배열, 예외처리.
3 장 stack and queue.
어서와 Java는 처음이지! 제4장 배열.
Internet Computing KUT Youn-Hee Han
제 4장 문 장 배정문 혼합문 제어문 표준 입출력.
Chapter 10 – 추상 자료형 Outline 10.1 소개 10.2 Ada의 추상 자료형 10.3 C++의 추상 자료형
실전 프로젝트 2 : 숫자야구 숫자 야구를 구현해보자.
명품 C++ 13장 예외 처리와 C 언어와의 링크 지정.
CHAP 6:큐 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
5장. 리스트 리스트 학습목표 목록이나 도표처럼 여러 데이터를 관리할 수 있는 자료형을 추상화
2주 실습강의 Java의 기본문법(1) 인공지능연구실.
Chapter 02 자바 기본구조 자바 프로그래밍의 기초적인 문법을 소개
Internet Computing KUT Youn-Hee Han
제7장 제어구조 I – 식과 문장.
명품 JAVA Essential.
Internet Computing KUT Youn-Hee Han
4장 스택.
배열, 포인터, 참조 배열은 같은 형을 가지는 변수들의 묶음이다..
Choi, Namseok Java 기초 (Java의 제어문과 배열) Choi, Namseok
제 4 장 L i s t.
스택(stack) SANGJI University Kwangman Ko
강의 #6 큐(Queue).
CHAP 6:큐 C로 쉽게 풀어쓴 자료구조 Slide 1 (of 27).
CHAP 6:큐 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
다음 주 과제 7장 읽어오기 숙제 해서 다음 주(11월 12일) 제출하기. 큐(Queue) E304호,
Chapter 06. 스택(Stack) Chapter 06-1: 스택의 이해와 ADT 정의.
명품 Java Programming.
Chapter 06. 스택.
최용술 장 Thread 최용술
C언어 응용 제 10 주 트리.
2장 자바환경과 자바 프로그램 2.1 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램
Chapter 05. 클래스 완성. chapter 05. 클래스 완성 01. 복사 생성자 복사 생성(Copy Construction) 생성될 때 자신과 같은 타입의 객체를 변수로 받아, 이 객체와 같은 값을 갖는 새로운 객체를 생성하는 것 명시적인 생성 과정뿐만.
자료구조: CHAP 5 스택 순천향대학교 컴퓨터공학과 하 상 호.
주소록 프로그램.
스택(Stack) 김진수
제 4주 2014년 1학기 강원대학교 컴퓨터학부 담당교수: 정충교
12 검색.
IT CookBook, 자바로 배우는 쉬운 자료구조
Introduction To Data Structures Using C
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
어서와 Java는 처음이지! 제4장 배열 IT응용시스템공학과 김형진 교수.
8 큐.
배열과 연결리스트 연결리스트 배열 메모리 할당이 연속적이어서 인덱스 사용시 검색이 빠르다.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
03. 안드로이드를 위한 Java 문법 제목. 03. 안드로이드를 위한 Java 문법 제목.
WAP Java Seminar
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
Chapter 04 리스트.
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
4장 - PHP의 표현식과 흐름 제어-.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
컴퓨터공학실습(I) 3주 인공지능연구실.
C언어 응용 제7주 실습 해보기 제6장.
자바 5.0 프로그래밍.
Chapter 02. 소프트웨어와 자료구조.
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
조 병 규 Software Quality Lab. 한 국 교 통 대 학 교
제 11장. 템플릿과 STL 학기 프로그래밍언어및실습 (C++).
JVM의 구조와 메모리 모델 JVM의 내부 구조 클래스 파일 클래스 로더 메소드(method) 영역 힙(heap) 영역
자료구조론 8장 큐(queue).
Choi Younghwan CSE HUFS
배열, 포인터, 함수 Review & 과제 1, 2.
PHP 기초문법 PHP를 공부하는데 있어 가장 기초가 되는 PHP기초문법에 대해서 배워 봅니다.
Presentation transcript:

7 스택

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

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

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

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

스택 스택의 연산 스택에서의 삽입 연산 : push 스택에서의 삭제 연산 : pop

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

스택의 추상 자료형 스택에 대한 추상 자료형 ADT Stack 데이터 : 0개 이상의 원소를 가진 유한 순서 리스트 스택에 대한 추상 자료형 ADT Stack 데이터 : 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 [ADT 7-1]

추상자료형 스택 스택의 push 알고리즘 top ← top+1; 스택 S에서 top이 마지막 자료를 가리키고 있으므로 그 위에 자료를 삽입하려면 먼저 top의 위치를 하나 증가 만약 이때 top의 위치가 스택의 크기(stack_SIZE)보다 크다면 오버플로우(overflow)상태가 되므로 삽입 연산을 수행하지 못하고 연산 종료 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]

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

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

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

스택의 구현 순차 자료구조 방식을 이용하여 구현한 스택 프로그램 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]

스택의 구현 순차 자료구조 방식을 이용하여 구현한 스택 프로그램 19 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 } [예제 7-1]

스택의 구현 순차 자료구조 방식을 이용하여 구현한 스택 프로그램 37 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 } [예제 7-1]

스택의 구현 순차 자료구조 방식을 이용하여 구현한 스택 프로그램 56 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 } [예제 7-1]

스택의 구현 순차 자료구조 방식을 이용하여 구현한 스택 프로그램 75 } 76 } 77 78 class Ex7_1{ 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]

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

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

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

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

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

스택의 구현 연결 자료구조 방식을 이용하여 구현한 스택 프로그램 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]

스택의 구현 연결 자료구조 방식을 이용하여 구현한 스택 프로그램 18 return (top == null); 19 } 20 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; [예제 7-2]

스택의 구현 연결 자료구조 방식을 이용하여 구현한 스택 프로그램 37 return item; 38 } 39 } 40 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!!"); [예제 7-2]

스택의 구현 연결 자료구조 방식을 이용하여 구현한 스택 프로그램 53 return 0; 54 } 55 else 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]

스택의 구현 연결 자료구조 방식을 이용하여 구현한 스택 프로그램 71 } 72 } 73 74 class Ex7_2{ 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]

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

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

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

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

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

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

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

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

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

스택의 응용 수식의 괄호 검사 알고리즘 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 = "]" : if (open_pair ≠ "[") then return false; symbol = "}" : if (open_pair ≠ "{") then return false; [알고리즘 7-3]

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

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

스택의 응용 >> 계속

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

스택의 응용 – (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]

스택의 응용 연결 자료구조 방식을 이용하여 구현한 스택 프로그램 020 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 } [예제 7-3]

스택의 응용 연결 자료구조 방식을 이용하여 구현한 스택 프로그램 039 } 040 039 } 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; [예제 7-3]

스택의 응용 연결 자료구조 방식을 이용하여 구현한 스택 프로그램 058 } 059 058 } 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 [예제 7-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 '}' : 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; 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': 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 } 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]

스택의 응용 연결 자료구조 방식을 이용하여 구현한 스택 프로그램 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]

스택의 응용 연결 자료구조 방식을 이용하여 구현한 스택 프로그램 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]

스택의 응용 연결 자료구조 방식을 이용하여 구현한 스택 프로그램 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]

스택의 응용 연결 자료구조 방식을 이용하여 구현한 스택 프로그램 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]

스택의 응용 연결 자료구조 방식을 이용하여 구현한 스택 프로그램 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]

스택의 응용 실행결과

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

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

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

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

스택의 응용 예) ((A*B)-(C/D))

스택의 응용 예) ((A*B)-(C/D))

스택의 응용 예) ((A*B)-(C/D))

스택의 응용 예) ((A*B)-(C/D))

스택의 응용 중위 표기법에 대한 후위 표기법 변환 알고리즘 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 else : } end infix_to_postfix( ) [알고리즘 7-4]

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

스택의 응용 후위 표기 수식의 연산 알고리즘 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]

스택의 응용 예) AB*CD/-

스택의 응용 예) AB*CD/-

스택의 응용 예) AB*CD/-

스택의 응용 후위 표기 수식의 연산 프로그램 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]

스택의 응용 후위 표기 수식의 연산 프로그램 20 public int pop(){ 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; [예제 7-4]

스택의 응용 후위 표기 수식의 연산 프로그램 39 int opr1, opr2, value; 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(); [예제 7-4]

스택의 응용 후위 표기 수식의 연산 프로그램 59 } 60 } 61 62 class Ex7_4{ 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]