u ADT Stack 0 Stack Stack item Element

  • Slides: 54
Download presentation

스택 추상 데이타 타입 u 스택 ADT Stack 데이타 : 0개 이상의 원소를 가진

스택 추상 데이타 타입 u 스택 ADT Stack 데이타 : 0개 이상의 원소를 가진 유한 순서 리스트 연산 : Stack ∈ Stack; item ∈ Element; create. Stack() : : = create an empty stack; push(Stack, item) : : = insert item onto the top of Stack; is. Empty(Stack) : : = if Stack is empty then return true else return false; pop(Stack) : : = if is. Empty(Stack) then return null else { delete and return the top item of Stack }; remove(Stack) : : = if is. Empty(Stack) then return else remove the top item; End Stack 9

스택의 순차 표현 연산자 (2) u push, pop 연산자의 구현 push(Stack, item) // 스택

스택의 순차 표현 연산자 (2) u push, pop 연산자의 구현 push(Stack, item) // 스택 Stack의 톱에 item을 삽입 if top >= n-1 then stack. Full(); // stack. Full()은 현재의 배열에 top ← top +1; // 원소가 만원이 되었을 때 배열을 Stack[top] ← item; // 확장하는 함수 end push() pop(Stack) // 스택 Stack의 톱 원소를 삭제하고 반환 if top<0 then return null // Stack이 공백이면 null을 반환 else { item ← Stack[top]; top ← top-1; return item; } end pop() 12

스택의 순차 표현 연산자 (3) u remove, peek 연산자의 구현 remove(Stack) // 스택의 톱

스택의 순차 표현 연산자 (3) u remove, peek 연산자의 구현 remove(Stack) // 스택의 톱 원소를 삭제 if top<0 then return else top ← top-1; end remove() peek(Stack) // 스택의 톱 원소를 검색 if top<0 then return null // Stack이 공백이면 null을 반환 else return Stack[top]; end peek() 13

C 에서 스택의 구현 u 스택 ADT를 C로 구현 l 스택 structure의 정의 typedef

C 에서 스택의 구현 u 스택 ADT를 C로 구현 l 스택 structure의 정의 typedef struct { /* 스택의 원소 타입 */ int id; char name[10]; char grade; } element; l 스택 structure의 선언 element stack[STACK_SIZE]; /* 배열로 표현된 스택 */ int top = -1; /* top을 초기화 */ 14

C 배열을 이용한 스택의 구현 (1/4) u 배열로 stack을 구현한 C 프로그램 #include <stdio.

C 배열을 이용한 스택의 구현 (1/4) u 배열로 stack을 구현한 C 프로그램 #include <stdio. h> #define STACK_SIZE 100 typedef int element; element stack[STACK_SIZE]; /* 스택의 최대 크기 */ /* element를 int 타입으로 정의*/ void push(int *top, element item) { if(*top >= STACK_SIZE - 1) { /* 스택이 만원인 경우 */ printf(" Stack is fulln"); return; } stack[++(*top)] = item; /* top은 top+1로*/ } /* ++(*top); stack[*top] = item; */ 15

C 배열을 이용한 스택의 구현 (2/4) element pop(int *top) { if (*top == -1)

C 배열을 이용한 스택의 구현 (2/4) element pop(int *top) { if (*top == -1) { printf("Stack is emptyn"); exit(1); } else return stack[(*top)--]; } int is. Empty(int *top) { if (*top == -1) return 1; else return 0; } /* 스택이 공백인 경우 */ /* top은 top-1로 */ /* return stack[*top]; (*top)--; */ /* 공백이면 1, 공백이 아니면 0 */ 16

C 배열을 이용한 스택의 구현 (3/4) void delete(int *top) { if (*top == -1)

C 배열을 이용한 스택의 구현 (3/4) void delete(int *top) { if (*top == -1) { printf("Stack is emptyn"); exit(1); } else (*top)--; } element peek(int top) { if (top == -1) { printf("Stack is emptyn"); exit(1); } else return stack[top]; } /* 스택이 공백인 경우 */ 17

C 배열을 이용한 스택의 구현 (4/4) int main( void ) { int top=-1; element

C 배열을 이용한 스택의 구현 (4/4) int main( void ) { int top=-1; element data 1, data 2; printf("push data 1 : %dn", 1); push(&top, 1); printf("push data 2 : %dn", 2); push(&top, 2); data 2 = peek(top); printf("peek data 2 : %dn", data 2); delete(&top); printf("delete data 2n"); data 1 = pop(&top); printf("pop data 1 : %dn", data 1); return 0; } 18

복수 스택을 위한 스택 연산 (1/2) is. Empty(i) // 스택 i의 공백 검사 if

복수 스택을 위한 스택 연산 (1/2) is. Empty(i) // 스택 i의 공백 검사 if t[i] == b[i] then return true else return false; end is. Empty() push(i, item) // 스택 i에 item을 삽입 if t[i] = b[i+1] then stack. Full(i); // 스택 확장 t[i] ← t[i]+1; m. Stack[t[i]] ← item; end push() 21

복수 스택을 위한 스택 연산 (2/2) pop(i) // 스택 i에서 톱 원소를 삭제하여 반환

복수 스택을 위한 스택 연산 (2/2) pop(i) // 스택 i에서 톱 원소를 삭제하여 반환 if t[i] = b[i] then return null else item ← m. Stack[t[i]]; t[i] ← t[i]-1; return item; end pop() remove(i) // 스택 i에서 톱 원소를 삭제 if t[i] = b[i] return else t[i] ← t[i] – 1; end remove() peek(i) // 스택 i에서 톱 원소를 검색 if t[i]= b[i] then return null else return m. Stack[t[i]]; end peek() 22

연결 스택의 연산자 (1/2) create. Stack() // 공백 연결 스택 생성 top ← null

연결 스택의 연산자 (1/2) create. Stack() // 공백 연결 스택 생성 top ← null end create. Stack() is. Empty(Stack) // 연결 스택의 공백 검사 return (top = null); end is. Empty() push(Stack, item) // 연결 스택 톱에 item을 삽입 new. Node ← get. Node(); new. Node. data ← item; new. Node. link ← top; top ← new. Node; end push() pop(Stack) // 연결 스택에서 톱 원소를 삭제하여 반환 if top = null then return null else { item ← top. data; old. Node ← top; top ← top. link; ret. Node(old. Node); return item; } end pop() 26

연결 스택의 연산자 (2/2) remove(Stack) // 연결 스택에서 톱 원소를 삭제 if top =

연결 스택의 연산자 (2/2) remove(Stack) // 연결 스택에서 톱 원소를 삭제 if top = null then returnl else { old. Node ← top; top ← top. link; ret. Node(old. Node); } end remove() peek(Stack) // 스택의 톱 원소를 검색 if top = null then return null else return (top. data); end peek() 27

k개의 스택의 연결 표현 (1/2) u Stack. Top[k] : 스택의 톱(top)을 관리하는 배열 u

k개의 스택의 연결 표현 (1/2) u Stack. Top[k] : 스택의 톱(top)을 관리하는 배열 u 연산 is. Empty(i) //스택 i의 공백 검사 if Stack. Top[i] = null then return true else reutrn false; end is. Empty() push(i, item) // 스택 i에 item을 삽입 new. Node ← get. Node(); new. Node. data ← item; new. Node. link ← Stack. Top[i]; Stack. Top[i] ← new. Node; end push() 28

k개의 스택의 연결 표현 (2/2) pop(i) // 스택 i에서 원소를 삭제하고 반환 if Stack.

k개의 스택의 연결 표현 (2/2) pop(i) // 스택 i에서 원소를 삭제하고 반환 if Stack. Top[i] = null then return null else { item ← Stack. Top[i]. data; old. Node ← Stack. Top[i]; Stack. Top[i] ← Stack. Top[i]. link; ret. Node(old. Node); return item; } end pop() remove(i) //스택 i에서 원소를 삭제 if Stack. Top[i] = null then return else { old. Node ← Stack. Top[i]; Stack. Top[i] ← Stack. Top[i]. link; ret. Node(old. Node); } end peek() peek(i) //스택 i에서 원소 검색 if Stack. Top[i] = null then return null else return Stack. Top[i]. data; end peek() 29

C 리스트를 이용한 스택 구현 (2/7) u 연결 리스트로 Stack을 구현한 C 프로그램 #include

C 리스트를 이용한 스택 구현 (2/7) u 연결 리스트로 Stack을 구현한 C 프로그램 #include <stdio. h> #include <stdlib. h> #include <string. h> typedef struct { int id; char name[10]; char grade; } element ; typedef struct stack. Node { element data; struct stack. Node *link; } stack. Node; /*스택 원소 구조 */ /* 리스트 노드 구조 */ 31

C 리스트를 이용한 스택 구현 (3/7) void push(stack. Node **top, element data) { /*

C 리스트를 이용한 스택 구현 (3/7) void push(stack. Node **top, element data) { /* 스택의 톱에 원소를 삽입 */ stack. Node* temp; temp = (stack. Node*)malloc(sizeof(stack. Node)); temp->data = data; temp->link = *top; *top = temp; } 32

C 리스트를 이용한 스택 구현 (4/7) element pop(stack. Node **top) { /*스택의 톱 원소를

C 리스트를 이용한 스택 구현 (4/7) element pop(stack. Node **top) { /*스택의 톱 원소를 반환하고 노드는 삭제 */ stack. Node* temp; element data; temp = *top; if(temp == NULL) { /* 스택이 공백이면 */ printf("Stack is emptyn"); exit(1); } else { data = temp->data; *top = temp->link; free(temp); /* 연결 리스트에서 노드를 삭제 */ return data; } } 33

C 리스트를 이용한 스택 구현 (5/7) element peek(stack. Node *top) /*스택의 톱 원소를 검색

C 리스트를 이용한 스택 구현 (5/7) element peek(stack. Node *top) /*스택의 톱 원소를 검색 */ { element data; if(top == NULL) { /* 스택이 공백이면 */ printf("Stack is emptyn"); exit(1); } else { data = top->data; return data; } } 34

C 리스트를 이용한 스택 구현 (6/7) void delete(stack. Node **top) /*스택의 톱 원소를 삭제

C 리스트를 이용한 스택 구현 (6/7) void delete(stack. Node **top) /*스택의 톱 원소를 삭제 */ { stack. Node* temp; if(*top == NULL) { /* 스택이 공백이면 */ printf("Stack is emptyn"); exit(1); } else { temp = *top; *top = (*top)->link; free(temp); } } 35

C 리스트를 이용한 스택 구현 (7/7) int main( void ) { stack. Node *top

C 리스트를 이용한 스택 구현 (7/7) int main( void ) { stack. Node *top = NULL; /*공백 연결 스택으로 top을 선언 */ element data 1, data 2, data 3, data 4; data 1. id = 1; strcpy(data 1. name, "Lee"); data 1. grade = 'A'; data 2. id = 2; strcpy(data 2. name, "Park"); data 2. grade = 'B'; printf("push data 1 : (%d, %s, %d)n", data 1. id, data 1. name, data 1. grade); push(&top, data 1); printf("push data 2 : (%d, %s, %d)n", data 2. id, data 2. name, data 2. grade); push(&top, data 2); data 3 = peek(top); printf("peek data 2 : (%d, %s, %d)n", data 3. id, data 3. name, data 3. grade); delete(&top); printf("delete data 2n"); data 4 = pop(&top); printf("pop data 1 : (%d, %s, %d)n", data 4. id, data 4. name, data 4. grade); return 0; } 36

수식의 괄호쌍 검사 u u 수식 : 대괄호, 중괄호, 소괄호를 포함 스택을 이용한 수식의

수식의 괄호쌍 검사 u u 수식 : 대괄호, 중괄호, 소괄호를 포함 스택을 이용한 수식의 괄호 검사 알고리즘 paren. Test( ) { // 괄호가 올바로 사용되었으면 true를 반환 exp ← Expression; //수식의 끝은 ∞문자로 가정 paren. Stack ← null; while true do { symbol ← get. Symbol(exp); case { symbol = "(" or "[" or “{": push(paren. Stack, symbol); symbol = ")": left ← pop(paren. Stack); if (left ≠ "(") then return false; symbol = "]": left ← pop(paren. Stack); if (left ≠ "[") then return false; symbol = “}”: left ← pop(paren. Stack); if (left ≠ “{") then return false; symbol = “∞”: if (is. Empty(paren. Stack)) then return ture else return false; else: // 괄호 이외의 수식 문자 } //end case } //end while end paren. Test() 37

후위 표기식으로의 변환 알고리즘 make. Postfix(e) // e는 주어진 중위표기식으로 끝은 ∞으로 표시 //

후위 표기식으로의 변환 알고리즘 make. Postfix(e) // e는 주어진 중위표기식으로 끝은 ∞으로 표시 // PIS와 PIE는 우선 순위를 반환해주는 함수 // PIS (-∞) ← -1, stack[0] ← - ∞ , top ← 0, stack[n]을 가정 while true do token ← get. Token(e); case { token = operand : print(token); token = ")" : while stack[top] != "(" do print(pop(stack)); top ← top - 1; // "("를 제거 token = operator : // "("가 제일 높은 PIE를 가짐. while PIS(stack[top]) >= PIE(token) do print(pop(stack)); push(stack, token); token = ∞ : //중위식의 끝 while top > -1 do print(pop(stack)) } //end case } //end while print(' ∞'); return; end make. Postfix() 49