강의자료4

891 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
891
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

강의자료4

  1. 1. 3 장 ADTs Stack and Queue
  2. 2. What is a Stack? <ul><li>Logical (or ADT) level: A stack is an ordered group of homogeneous items (elements), in which the removal and addition of stack items can take place only at the top of the stack. </li></ul><ul><li>( 순서가 있는 동형의 원소들의 모임 ; 원소의 삽입과 삭제가 스택의 top 에서만 일어남 ) </li></ul><ul><li>A stack is a LIFO “last in, first out” structure. </li></ul><ul><li>( LIFO 구조 ) </li></ul>
  3. 3. 스택 추상 데이타 타입 <ul><li>순서 리스트의 특별한 경우 </li></ul><ul><li>순서 리스트 : A=a 0 , a 1 , …, a n-1 , n  0 </li></ul><ul><li>스택 (stack) </li></ul><ul><ul><li>톱 (top) 이라고 하는 한쪽 끝에서 모든 삽입 (push) 과 삭제 (pop) 가 일어나는 순서 리스트 </li></ul></ul><ul><ul><ul><li>스택 S=(a 0 ,....,a n-1 ): </li></ul></ul></ul><ul><ul><ul><li>a 0 는 bottom, a n-1 은 top 의 원소 </li></ul></ul></ul><ul><ul><ul><li>a i 는 원소 a i-1 (0<i<n) 의 위에 있음 </li></ul></ul></ul><ul><ul><li>후입선출 (LIFO, Last-In-First-Out) 리스트 </li></ul></ul>
  4. 4. 스택 추상 데이타 타입 <ul><li>원소 A,B,C,D,E 를 삽입하고 한 원소를 삭제하는 예 </li></ul>
  5. 5. Stack ADT Operations (ADT 연산 ) <ul><li>MakeEmpty -- Sets stack to an empty state. ( 스택을 빈 상태로 설정 ) </li></ul><ul><li>IsEmpty -- Determines whether the stack is currently empty. ( 스택에 비어있는지를 판별 ) </li></ul><ul><li>IsFull -- Determines whether the stack is currently full. </li></ul><ul><li>( 스택에 꽉 차 있는지를 판별 ) </li></ul><ul><li>Push (ItemType newItem) -- error occurs if stack is full; otherwise adds newItem to the top of the stack. </li></ul><ul><li>원소의 삽입 ( 스택이 full 이면 오류 발생 ) </li></ul><ul><li>Pop (ItemType &item) – error occurs if stack is empty; otherwise removes the item at the top of the stack. </li></ul><ul><li>원소의 삭제 ( 스택이 empty 이면 오류 발생 ) </li></ul>
  6. 6. ADT Stack Operations <ul><li>Transformers </li></ul><ul><ul><li>MakeEmpty </li></ul></ul><ul><ul><li>Push </li></ul></ul><ul><ul><li>Pop </li></ul></ul><ul><li>Observers </li></ul><ul><ul><li>IsEmpty </li></ul></ul><ul><ul><li>IsFull </li></ul></ul>
  7. 7. <ul><li>Typedef int ItemType; </li></ul><ul><li>Const maxStack = 100; </li></ul><ul><li>class StackType </li></ul><ul><li>{ </li></ul><ul><li>public: </li></ul><ul><li>StackType( ); </li></ul><ul><li>// Class constructor. </li></ul><ul><li>void MakeEmpty(); </li></ul><ul><li>// Function: Make the stack empty. </li></ul><ul><li>// Pre: None. </li></ul><ul><li>// Post: Stack becomes empty. </li></ul><ul><li>bool IsFull () const; </li></ul><ul><li>// Function: Determines whether the stack is full. </li></ul><ul><li>// Pre: Stack has been initialized </li></ul><ul><li>// Post: Function value = (stack is full) </li></ul>
  8. 8. <ul><li>bool IsEmpty() const; </li></ul><ul><li>// Function: Determines whether the stack is empty. </li></ul><ul><li>// Pre: Stack has been initialized. </li></ul><ul><li>// Post: Function value = (stack is empty) </li></ul><ul><li>void Push( ItemType item ); </li></ul><ul><li>// Function: Adds newItem to the top of the stack. </li></ul><ul><li>// Pre: Stack has been initialized. </li></ul><ul><li>// Post: If (stack is full), error occurs ; </li></ul><ul><li>// otherwise, newItem is at the top of the stack. </li></ul><ul><li>void Pop(ItemType &item); </li></ul><ul><li>// Function: Removes top item from the stack. </li></ul><ul><li>// Pre: Stack has been initialized. </li></ul><ul><li>// Post: If (stack is empty), error occurs ; </li></ul><ul><li>// otherwise, top element has been removed from stack. </li></ul><ul><li>private: </li></ul><ul><li>int top; </li></ul><ul><li>ItemType items[maxStack]; </li></ul><ul><li>}; </li></ul>
  9. 9. Class Interface 및 Stack 의 배열 구현 StackType class StackType Pop Push IsFull IsEmpty Private data: top [maxStack] . . . [ 2 ] [ 1 ] items [ 0 ] MakeEmpty
  10. 10. <ul><li>// File: StackType.cpp </li></ul><ul><li>#include <iostream> </li></ul><ul><li>StackType::StackType( ) // 스택 초기화 </li></ul><ul><li>{ </li></ul><ul><li>top = -1; </li></ul><ul><li>} </li></ul><ul><li>void StackType::MakeEmpty() </li></ul><ul><li>{ </li></ul><ul><li>top = -1; </li></ul><ul><li>} </li></ul><ul><li>bool StackType::IsEmpty() const </li></ul><ul><li>{ </li></ul><ul><li>return(top = = -1); </li></ul><ul><li>} </li></ul><ul><li>bool StackType::IsFull() const </li></ul><ul><li>{ </li></ul><ul><li>return (top = = maxStack-1); </li></ul><ul><li>} </li></ul>Stack 구현 void StackType::Push(ItemType newItem) // 삽입 { if( IsFull() ) { cout << “Stack is full n”; // 예외처리 return; } top++; items[top] = newItem; } void StackType::Pop(ItemType item) // 삭제 { if( IsEmpty() ) { cout << “Stack is empty n”; // 예외처리 return; } item = items[top]; top--; }
  11. 11. Tracing Client Code char letter = ‘V’; StackType charStack; charStack.Push(letter); charStack.Push(‘C’); charStack.Push(‘S’); if ( !charStack.IsEmpty( )) charStack.Pop( ); charStack.Push(‘K’); while (!charStack.IsEmpty( )) { letter = charStack.Top(); charStack.Pop(0)} Private data: top [ MAX_ITEMS-1 ] . . . [ 2 ] [ 1 ] items [ 0 ] letter ‘ V’
  12. 12. What is a Generic Data Type? <ul><li>A generic data type is a type for which the operations are defined but the types of the items being manipulated are not defined. </li></ul><ul><li>연산들은 정의되어 있지만 처리하는 원소 ( 항목 ) 들의 자료형은 정의되어 있지 않은 자료형 </li></ul>
  13. 13. What is a Class Template? <ul><li>Generic data type 을 정의할 수 있게 해 주는 C++ 구조 </li></ul><ul><li>A class template allows the compiler to generate multiple versions of a class type by using type parameters. </li></ul><ul><li>class template: 자료형의 인자를 사용하여 클래스 자료형의 여러 버전을 생성할 수 있도록 해 줌 </li></ul><ul><li>The formal parameter appears in the class template definition, and the actual parameter appears in the client code. Both are enclosed in pointed brackets, < >. </li></ul><ul><li>자료형의 형식인자가 클래스 template 정의에 있어야 하고 실제인자는 client 코드에서 주어짐 </li></ul>
  14. 14. StackType<int> numStack; ACTUAL PARAMETER top 3 [MAX_ITEMS-1] . . . [ 3 ] 789 [ 2 ] -56 [ 1 ] 132 items [ 0 ] 5670
  15. 15. StackType<float> numStack; ACTUAL PARAMETER top 3 [MAX_ITEMS-1] . . . [ 3 ] 3456.8 [ 2 ] -90.98 [ 1 ] 98.6 items [ 0 ] 167.87
  16. 16. StackType<StrType> numStack; ACTUAL PARAMETER top 3 [MAX_ITEMS-1] . . . [ 3 ] Bradley [ 2 ] Asad [ 1 ] Rodrigo items [ 0 ] Max
  17. 17. <ul><li>//-------------------------------------------------------- </li></ul><ul><li>// CLASS TEMPLATE DEFINITION </li></ul><ul><li>//-------------------------------------------------------- </li></ul><ul><li>template<class ItemType> // formal parameter list ( 형식인자 리스트 ) </li></ul><ul><li>class StackType </li></ul><ul><li>{ </li></ul><ul><li>public: </li></ul><ul><li>StackType( ); </li></ul><ul><li>bool IsEmpty( ) const; </li></ul><ul><li>bool IsFull( ) const; </li></ul><ul><li>void Push( ItemType item ); </li></ul><ul><li>void Pop( ItemType& item ); </li></ul><ul><li>private: </li></ul><ul><li>int top; </li></ul><ul><li>ItemType items[MAX_ITEMS]; </li></ul><ul><li>}; </li></ul>
  18. 18. <ul><li>//-------------------------------------------------------- </li></ul><ul><li>// SAMPLE CLASS MEMBER FUNCTIONS </li></ul><ul><li>//-------------------------------------------------------- </li></ul><ul><li>template<class ItemType> // formal parameter list </li></ul><ul><li>StackType <ItemType> ::StackType( ) </li></ul><ul><li>{ </li></ul><ul><li>top = -1; </li></ul><ul><li>} </li></ul><ul><li>template<class ItemType> // formal parameter list </li></ul><ul><li>void StackType <ItemType> ::Push ( ItemType newItem ) </li></ul><ul><li>{ </li></ul><ul><li>if( IsFull() ) </li></ul><ul><li>{ </li></ul><ul><li> cout << “ Stack is full n ” ; // 예외처리 </li></ul><ul><li>return; </li></ul><ul><li>} </li></ul><ul><li>top++; </li></ul><ul><li>items[top] = newItem; // STATIC ARRAY IMPLEMENTATION </li></ul><ul><li>} </li></ul>
  19. 19. Using class templates <ul><li>The actual parameter to the template is a data type. Any type can be used, either built-in or user-defined. (template 의 실제인자는 자료형 ) </li></ul><ul><li>When creating class template </li></ul><ul><ul><li>Put .h and .cpp in same file or </li></ul></ul><ul><ul><li>Have .h include .cpp file </li></ul></ul><ul><li> </li></ul>
  20. 20. What is a pointer variable? <ul><li>A pointer variable is a variable whose value is the address of a location in memory. ( 포인터 변수 : 메모리의 주소 값을 가지는 변수 ) </li></ul><ul><li>To declare a pointer variable, you must specify the type of value that the pointer will point to. For example, </li></ul><ul><li>포인터 변수선언시 포인터가 가리키는 값의 자료형을 명시하여야 함 </li></ul><ul><li>int* ptr; // ptr will hold the address of an int </li></ul><ul><li>char* q; // q will hold the address of a char </li></ul>
  21. 21. Using a pointer variable <ul><li>int x; </li></ul><ul><li>x = 12; </li></ul><ul><li>int* ptr; </li></ul><ul><li>ptr = &x; </li></ul><ul><li>NOTE: Because ptr holds the address of x, we say that ptr “points to” x . </li></ul>2000 12 x 3000 2000 ptr
  22. 22. C++ Data Types Structured array struct union class Simple Integral Floating char short int long enum float double long double Address pointer reference
  23. 23. The NULL Pointer <ul><li>There is a pointer constant 0 called the “null pointer” denoted by NULL in cstddef. </li></ul><ul><li>But NULL is not memory address 0. </li></ul><ul><li>NOTE: It is an error to dereference a pointer whose value is NULL. Such an error may cause your program to crash, or behave erratically. It is the programmer’s job to check for this. </li></ul><ul><li>while (ptr != NULL) </li></ul><ul><li>{ </li></ul><ul><li>. . . // ok to use *ptr here </li></ul><ul><li>} </li></ul>
  24. 24. Allocation of memory ( 메모리 할당 ) STATIC ALLOCATION ( 정적할당 ) Static allocation is the allocation of memory space at compile time. ( 컴파일시 메모리 공간을 할당 ) DYNAMIC ALLOCATION ( 동적 할당 ) Dynamic allocation is the allocation of memory space at run time by using operator new. ( 실행시 new 연산자를 사용하여 메모리 공간을 할당 )
  25. 25. 3 Kinds of Program Data <ul><li>STATIC DATA: memory allocation exists throughout execution of program. ( 프로그램이 실행시부터 끝까지 메모리 할당이 유지 ) </li></ul><ul><li>static long SeedValue; </li></ul><ul><li>AUTOMATIC DATA: automatically created at function entry, resides in activation frame of the function, and is destroyed when returning from function. ( 함수 진입시 메모리 할당 ; 함수로부터 return 시 메모리 해제 ) </li></ul><ul><li>DYNAMIC DATA: explicitly allocated and deallocated during program execution by C++ instructions written by programmer using unary operators new and delete . ( 프로그램 수행시 new 에 의하여 메모리 할당 ; delete 에 의하여 메모리 해제 ) </li></ul>
  26. 26. Using operator new <ul><li>If memory is available in an area called the free store (or heap), operator new allocates the requested object or array, and returns a pointer to (address of ) the memory allocated. </li></ul><ul><li>힙이라는 메모리공간에 사용가능한 메모리가 남아 있으면 , new 는 요청한 만큼의 메모리를 할당하고 할당한 메모리의 주소를 반환 </li></ul><ul><li>Otherwise, the null pointer 0 is returned. </li></ul><ul><li>The dynamically allocated object exists until the delete operator destroys it. </li></ul>
  27. 27. Dynamically Allocated Data <ul><li>char* ptr; </li></ul><ul><li>ptr = new char; </li></ul><ul><li>*ptr = ‘ B ’ ; </li></ul><ul><li>cout << *ptr; </li></ul>2000 ptr
  28. 28. <ul><li>The object or array currently pointed to by the pointer is deallocated, and the pointer is considered unassigned. The memory is returned to the free store. </li></ul><ul><li>포인터가 가리키는 메모리 공간을 해제 ; 힙에 돌려줌 </li></ul><ul><li>Square brackets are used with delete to deallocate a dynamically allocated array of classes. </li></ul>Using operator delete
  29. 29. Some C++ pointer operations <ul><li>Precedence </li></ul><ul><li>Higher -> Select member of class pointed to </li></ul><ul><li>Unary: ++ -- ! * new delete </li></ul><ul><li> Increment, Decrement, NOT, Dereference, Allocate, Deallocate </li></ul><ul><li> * / % </li></ul><ul><li> + - Add Subtract </li></ul><ul><li> < <= > >= Relational operators </li></ul><ul><li> == != Tests for equality, inequality </li></ul><ul><li>Lower = Assignment </li></ul>
  30. 30. Dynamic Array Allocation char *ptr; // ptr is a pointer variable that // can hold the address of a char ptr = new char[ 5 ]; // dynamically, during run time, allocates // memory for 5 characters and places into // the contents of ptr their beginning address ptr 6000 6000
  31. 31. Dynamic Array Allocation char *ptr ; ptr = new char[ 5 ]; strcpy( ptr, “Bye” ); ptr[ 1 ] = ‘u’; // a pointer can be subscripted cout << ptr[ 2] ; ptr 6000 6000 ‘ B’ ‘y’ ‘e’ ‘0’ ‘ u’
  32. 32. Dynamic Array Deallocation char *ptr ; ptr = new char[ 5 ]; strcpy( ptr, “Bye” ); ptr[ 1 ] = ‘u’; delete ptr; // deallocates array pointed to by ptr // ptr itself is not deallocated, but // the value of ptr is considered unassigned ptr ?
  33. 33. <ul><li>int* ptr = new int; </li></ul><ul><li>*ptr = 3; </li></ul><ul><li>ptr = new int; // changes value of ptr </li></ul><ul><li>*ptr = 4; </li></ul>What happens here? 3 ptr 3 ptr 4
  34. 34. Memory Leak <ul><li>A memory leak occurs when dynamic memory (that was created using operator new) has been left without a pointer to it by the programmer, and so is inaccessible. </li></ul><ul><li>동적메모리를 가리키는 포인터가 없으면서 </li></ul><ul><li>할당된 상태로 남아 있음 ; 접근 불가능 </li></ul><ul><li>int* ptr = new int; </li></ul><ul><li>*ptr = 8; </li></ul><ul><li>int* ptr2 = new int; </li></ul><ul><li>*ptr2 = -5; </li></ul><ul><li>How else can an object become inaccessible? </li></ul>8 ptr -5 ptr2
  35. 35. Causing a Memory Leak <ul><li>int* ptr = new int; </li></ul><ul><li>*ptr = 8; </li></ul><ul><li>int* ptr2 = new int; </li></ul><ul><li>*ptr2 = -5; </li></ul><ul><li>ptr = ptr2; // here the 8 becomes inaccessible </li></ul>8 ptr -5 ptr2 8 ptr -5 ptr2
  36. 36. <ul><li>occurs when two pointers point to the same object and delete is applied to one of them. </li></ul><ul><li>두개의 포인터가 같은 객체를 가리키고 있는 상태에서 이들 포인터 중 하나에 delete 가 적용됨 </li></ul><ul><li>int* ptr = new int; </li></ul><ul><li>*ptr = 8; </li></ul><ul><li>int* ptr2 = new int; </li></ul><ul><li>*ptr2 = -5; </li></ul><ul><li>ptr = ptr2; </li></ul>A Dangling Pointer 8 ptr -5 ptr2 FOR EXAMPLE,
  37. 37. <ul><li>int* ptr = new int; </li></ul><ul><li>*ptr = 8; </li></ul><ul><li>int* ptr2 = new int; </li></ul><ul><li>*ptr2 = -5; </li></ul><ul><li>ptr = ptr2; </li></ul><ul><li>delete ptr2; // ptr is left dangling </li></ul><ul><li>ptr2 = NULL; </li></ul>Leaving a Dangling Pointer 8 ptr NULL ptr2 8 ptr -5 ptr2
  38. 38. DYNAMIC ARRAY IMPLEMENTATION StackType ~StackType Push Pop . . . class StackType Private Data: top 2 maxStack 5 items 50 43 80 items [0] items [1] items [2] items [3] items [4]
  39. 39. <ul><li>// StackType class template </li></ul><ul><li>template<class ItemType> </li></ul><ul><li>class StackType </li></ul><ul><li>{ </li></ul><ul><li>public: </li></ul><ul><li>StackType(int max ); // max is stack size </li></ul><ul><li>StackType(); // Default size is 500 </li></ul><ul><li>// Rest of the prototypes go here. </li></ul><ul><li>private: </li></ul><ul><li>int top; </li></ul><ul><li>int maxStack; // Maximum number of stack items. </li></ul><ul><li>ItemType* items; // Pointer to dynamically allocated memory </li></ul><ul><li>}; </li></ul>
  40. 40. <ul><li>// Implementation of member function templates </li></ul><ul><li>template<class ItemType> </li></ul><ul><li>StackType<ItemType>::StackType(int max) </li></ul><ul><li>// parameterized class constructor </li></ul><ul><li>{ </li></ul><ul><li>maxStack = max; </li></ul><ul><li>top = -1; </li></ul><ul><li>items = new ItemType[maxStack]; </li></ul><ul><li>} </li></ul><ul><li>template<class ItemType> </li></ul><ul><li>StackType<ItemType>::StackType() // default class constructor </li></ul><ul><li>{ </li></ul><ul><li>maxStack = 500; </li></ul><ul><li>top = -1; </li></ul><ul><li>items = new ItemType[max]; </li></ul><ul><li>} </li></ul>
  41. 41. <ul><li>// Templated StackType class variables declared </li></ul><ul><li>StackType<int> myStack(100); </li></ul><ul><li>// Stack of at most 100 integers. </li></ul><ul><li>StackType<float> yourStack(50); </li></ul><ul><li>// Stack of at most 50 floating point values. </li></ul><ul><li>StackType<char> aStack; </li></ul><ul><li>// Stack of at most 500 characters. </li></ul>
  42. 42. 스택의 응용 <ul><li>함수 호출과 return 의 구현 </li></ul><ul><li>1. 함수 호출시 return address 를 스택에 push </li></ul><ul><li>2. 함수 수행을 끝내고 return 할 때 돌아갈 주소는 스택에서 pop </li></ul><ul><li>식의 표기방법 </li></ul><ul><li>opr1: 왼쪽 피연산자 </li></ul><ul><li>opr2: 오른쪽 피연산자 </li></ul><ul><li>op: 연산자 </li></ul><ul><li>1. infix notation: opr1 op opr2 </li></ul><ul><li>2. prefix notation: op opr1 opr2 </li></ul><ul><li>3. postfix notation: opr1 opr2 op </li></ul>
  43. 43. 함수 호출과 return 의 구현 <ul><li>시스템 스택 </li></ul><ul><ul><li>프로그램 실행시 함수 호출을 처리 </li></ul></ul><ul><ul><li>함수 호출시 활성 레코드 (activation record) 또는 스택 프레임 (stack frame) 구조 생성하여 시스템 스택의 톱에 둔다 . </li></ul></ul><ul><ul><ul><li>이전의 스택 프레임에 대한 포인터 </li></ul></ul></ul><ul><ul><ul><li>복귀 주소 </li></ul></ul></ul><ul><ul><ul><li>지역 변수 </li></ul></ul></ul><ul><ul><ul><li>매개 변수 </li></ul></ul></ul><ul><ul><li>함수가 자기자신을 호출하는 순환 호출도 마찬가지로 처리 </li></ul></ul><ul><ul><ul><li> 순환 호출시마다 새로운 스택 프레임 생성 </li></ul></ul></ul><ul><ul><ul><li> 최악의 경우 가용 메모리 전부 소모 </li></ul></ul></ul>
  44. 44. 함수 호출과 return 의 구현 <ul><li>주 함수가 함수 a1 을 호출하는 예 </li></ul>함수 호출 뒤의 시스템 스택
  45. 45. 수식의 표현방법 <ul><li>예 </li></ul><ul><li>infix 수식 : a * (b + c ) – d </li></ul><ul><li>prefix 수식 : - * a + b c d </li></ul><ul><li>postfix 수식 : a b c + * d - </li></ul><ul><li>Infix 식 : 결과값을 계산하는데 연산자의 우선순위를 고려해야 하므로 시간에 있어서 비효율적 </li></ul><ul><li>Prefix 식 , Postfix 식 : 결과값을 계산하는데 간편하다 ( 효율적이다 ). </li></ul>
  46. 46. Postfix 수식의 계산 <ul><li>스택을 이용하여 계산 </li></ul><ul><li>while( 수식에서 입력할 것이 있으면 ) </li></ul><ul><li>{ </li></ul><ul><li>수식에서 입력하여 이를 변수 x 에 저장 </li></ul><ul><li>x 가 operand 이면 스택에 push </li></ul><ul><li>x 가 operator 이면 </li></ul><ul><li>opr2  스택에서 pop </li></ul><ul><li>opr1  스택에서 pop </li></ul><ul><li>opr1 op opr2 를 계산하여 이를 스택에 push </li></ul><ul><li>} </li></ul><ul><li>수식의 결과값  스택에서 pop </li></ul>
  47. 47. Infix 수식의 Postfix 수식변환 <ul><li>1. Infix 수식을 괄호로 묶는다 . </li></ul><ul><li>2. 모든 연산자를 해당하는 ‘ ) ’ 바로 앞으로 보낸다 . </li></ul><ul><li>3. 모든 괄호를 제거한다 . </li></ul><ul><li>infix 수식 : a * (b + c ) – d </li></ul><ul><li>((a * (b + c )) – d) </li></ul><ul><li> ((a (b c +) *) d -) </li></ul><ul><li> a b c + * d - </li></ul>
  48. 48. Infix 수식의 Postfix 수식변환 <ul><li>스택을 이용하여 변환 </li></ul><ul><li>수식을 왼쪽에서부터 차례대로 x 에 읽어 들임 </li></ul><ul><li>if (x 가 피연산이면 ) </li></ul><ul><li>output x; </li></ul><ul><li>else if (x 가 ‘ ( ‘ 이면 스택에 push) </li></ul><ul><li>else if (x 가 ‘ ) ’ 이면 ) </li></ul><ul><li>스택에서 ‘ ( ‘ 를 만날 때까지 스택에서 pop 하여 이를 output </li></ul><ul><li>else 다음을 반복 </li></ul><ul><li>{ </li></ul><ul><li>스택에 있는 것보다 우선순위가 높으면 </li></ul><ul><li>{x 를 push; continue} </li></ul><ul><li>그렇지 않으면 스택에서 pop 하여 이를 output </li></ul><ul><li>} </li></ul>
  49. 49. 예 <ul><li>a * (b + c ) – d </li></ul><ul><li> => output a -- 출력결과 a </li></ul><ul><li>a * (b + c ) – d </li></ul><ul><li> => 스택에 * 를 push </li></ul><ul><li>a * (b + c ) – d </li></ul><ul><li> => 스택에 ( 를 push </li></ul><ul><li>a * (b + c ) – d </li></ul><ul><li> => output b -- 출력결과 a b </li></ul><ul><li>a * (b + c ) – d </li></ul><ul><li> => 스택에 + 를 push </li></ul><ul><li>a * (b + c ) – d </li></ul><ul><li> => output c -- 출력결과 a b c </li></ul><ul><li>a * (b + c ) – d </li></ul><ul><li> => 스택에서 pop -- 출력결과 a b c + </li></ul>* ( * * ( + *
  50. 50. 예 <ul><li>a * (b + c ) – d </li></ul><ul><li> => 스택에서 pop -- 출력결과 a b c + </li></ul><ul><li>a * (b + c ) – d </li></ul><ul><li> => 스택에서 pop -- 출력결과 a b c + * </li></ul><ul><li>스택에 – 를 push </li></ul><ul><li>a * (b + c ) – d </li></ul><ul><li> => output d -- 출력결과 a b c + * d </li></ul><ul><li>a * (b + c ) – d </li></ul><ul><li> => 스택에서 pop -- 출력결과 a b c + * d - </li></ul>-

×