제3장 스택과 큐.

Slides:



Advertisements
Similar presentations
스택 스택 추상자료형 스택 스택의 구현 스택의 응용 한빛미디어(주).
Advertisements

제 5 장 stack and queue.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
3 장 stack and queue.
제14장 동적 메모리.
제2장 배열과구조.
5장 큐.
1장 기본 개념.
연결리스트(linked list).
Linked List 학기 SANGJI University.
Chapter 05. 연결 자료 구조.
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
자료구조 실습 (03분반)
자료구조 김현성.
Internet Computing KUT Youn-Hee Han
제5장 트리.
4장 스택.
자료 구조: Chapter 3 (2)구조체, 포인터
제 4 장 L i s t.
제15장 파일 입출력 문자열을 출력하는 여러가지 방법 (15-2쪽) 문자열만 처리하는 입출력 함수
스택(stack) SANGJI University Kwangman Ko
head data link data link data link NULL a b c
자료 구조: Chapter 3 (2)구조체, 포인터
단순 연결 리스트 순차(sequential) 표현 연결된(linked) 표현 연속된 원소들이 일정한 거리만큼 떨어져서 저장
제 3 장 선형 리스트 3.1 선형 리스트 3.2 연결 리스트 3.3 다항식.
CHAP 4:리스트 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
CHAP 6:큐.
강의 #6 큐(Queue).
CHAP 6:큐 C로 쉽게 풀어쓴 자료구조 Slide 1 (of 27).
다음 주 과제 7장 읽어오기 숙제 해서 다음 주(11월 12일) 제출하기. 큐(Queue) E304호,
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
자료구조: CHAP 6 큐 컴퓨터공학과 하 상 호.
제 5 장. 스택(Stack).
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.
Chapter 06. 스택.
제3장 스택과 큐.
P150 문제를 프로그래밍 할 것 Source file (헤더파일포함), 실행화면 (학번_이름_1.txt)
Dynamic Memory and Linked List
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
CHAP 6:큐.
자료구조: CHAP 4 리스트 (1) 순천향대학교 컴퓨터공학과 하 상 호.
CHAP 4:리스트.
CHAP 6:큐.
자료구조: CHAP 4 리스트 (3) 순천향대학교 컴퓨터공학과 하 상 호.
프로그래밍 랩 – 7주 리스트.
CHAP 6:큐 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
2.3 제한 조건을 가진 자료구조 1. 스택(STACK) 1) 스택의 개념 - 삽입과 제거 작업이 리스트의 한쪽 끝에서만 수행
제 4 장 스택과 큐 4.1 스택(stack) 4.2 스택의 활용 4.3 큐 4.4 데큐.
Introduction To Data Structures Using C
자바 5.0 프로그래밍.
자기참조 구조체(1) 먼저 자신과 같은 형의 구조체를 포인트하는 포인터 멤버 필드를 갖는 구조체를 정의한다.
배열과 연결리스트 연결리스트 배열 메모리 할당이 연속적이어서 인덱스 사용시 검색이 빠르다.
자료구조: CHAP 7 트리 –review 순천향대학교 컴퓨터공학과 하 상 호.
* 프로그램을 간단히 하기 위해 malloc 성공체크는 안 함
Chapter 04 리스트.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
C언어 응용 제7주 실습 해보기 제6장.
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
조 병 규 Software Quality Lab. 한 국 교 통 대 학 교
데이터 동적 할당 Collection class.
자료구조론 8장 큐(queue).
보고서 #2(제출기한: 09/23) 다음 문제를 해결하시오. (7)
Numerical Analysis Programming using NRs
동적메모리와 연결 리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
제 4 장 Record.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
제 4 장. 리스트(List).
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

제3장 스택과 큐

2.3 다항식 추상 데이터 타입 순서리스트의 표현( 메모리 표현) i. 순차 사상 (sequential mapping) - 물리적 인접성 (arrays) ii.  비순차 사상(non-sequential mapping) - 비연속적 기억장소 위치 - 리스트 : pointers(links)를 가지는 노드 집합

3.1 스택 추상 데이터 타입 스택(Stack) : 가장 마지막에 입력된 데이터가 가장 먼저 출력되는 후입선출 자료구조 LIFO(Last-in-First-out) 후입선출 : 한 끝에서 모든 삽입과 삭제가 일어나는 구현원리 응용) Subroutine or recursive call

3.1 스택 추상 데이터 타입 데이터의 입력순서 A,B,C,D,E 데이터의 출력순서 E,D,C,B,A 초기상태 A입력 삭제 top E top D D C C top B B B top A A A A top

structure Stack objects: 0개 이상의 원소를 가진 유한 순서 리스트 functions: 모든 stack∈ Stack, item∈ element, max_stack_size∈ positive integer Stack CreateS(max_stack_size) ::= 최대 크기가 max_stack_size인 공백 스택을 생성 Boolean IsFull(stack, max_stack_size) ::= if (stack의 원소수 == max_stack_size) return TRUE else return FALSE Stack Add(stack, item) ::= if (IsFull(stack)) stack_full else stack의 톱에 item을 삽입하고 return Boolean IsEmpty(stack) ::= if (stack == CreateS(max_stack_size)) return TRUE Element Delete(stack) ::= if (IsEmpty(stack)) return else 스택 톱의 item을 제거해서 반환

3.1 스택 추상 데이터 타입 top Stack CreateS(max_stack_size) ::= #define MAX_STACK_SIZE 100 /*최대스택크기*/ typedef struct { int key; /* 다른 필드 */ } element; element stack[MAX_STACK_SIZE]; int top = -1; Boolean IsEmpty(Stack) ::= top < 0; Boolean IsFull(Stack) ::= top >= MAX_STACK_SIZE-1; MAX_STACK_SIZE top

3.1 스택 추상 데이터 타입 스택의 삽입 연산 void add(int *top, element item) { /* 전역 stack에 item을 삽입 */ if (*top >= MAX_STACK_SIZE-1) { stack_full(); return; } stack[++*top] = item; top A

3.1 스택 추상 데이터 타입 스택의 삭제 연산 element delete(int *top) { /* stack의 최상위 원소를 반환 */ if (*top == -1) return stack_empty(); /* 오류 key를 반환 */ return stack[(*top)--]; } top D C B A

3.2 큐 추상 데이터 타입 Queue : 가장 먼저 입력된 데이터가 가장 먼저 출력되는 선입선출 자료구조 FIFO(First-in-First-out) 선입선출리스트 : 한쪽 끝에서 데이터가 입력되고 그 반대쪽 끝에서 출력이 일어나는 구현원리 응용) Job scheduling

3.2 큐 추상 데이터 타입 데이터의 입력순서 A,B,C,D,E 데이터의 출력순서 A,B,C,D,E 초기상태 A입력 B입력 … 삭제 E rear E rear D D C C B rear B B A rear A A A front rear front front front front

structure Queue objects: 0개 이상의 원소를 가진 유한 순서 리스트 functions: 모든 queue∈Queue, item∈element, max_queue_size∈positive integer Queue CreateQ(max_queue_size) ::= 최대 크기가 max_queue_size인 공백 큐를 생성 Boolean IsFullQ(queue, max_queue_size ) ::= if (queue의 원소수 == max_queue_size) return TRUE else return FALSE Queue AddQ(queue, item) ::= if (IsFull(queue)) queue_full else queue의 뒤에 item을 삽입하고 이 queue를 반환 Boolean IsEmptyQ(queue) ::= if (queue == CreateQ(max_queue_size)) return TRUE Element DeleteQ(queue) ::= if (IsEmpty(queue)) return else queue의 앞에 있는 item을 제거해서 반환

3.2 큐 추상 데이터 타입 Queue CreateQ(max_queue_size) ::= #define MAX_QUEUE_SIZE 100 /* 큐의 최대크기 */ typedef struct { int key; /* 다른 필드 */ } element; element queue[MAX_QUEUE_SIZE]; int rear = -1; int front = -1; Boolean IsEmptyQ(queue) ::= front == rear Boolean IsFullQ(queue) ::= rear == MAX_QUEUE_SIZE-1 rear front

3.2 큐 추상 데이터 타입 큐의 삽입연산 void addq(int *rear, element item) { /* queue에 item을 삽입 */ if (*rear == MAX_QUEUE_SIZE-1) queue_full(); return; } queue[++*rear] = item; A rear front

3.2 큐 추상 데이터 타입 큐의 삭제연산 element deleteq(int *front, int rear) { /* queue의 앞에서 원소를 삭제 */ if (*front == rear) return queue_empty(); /* 에러 key를 반환 */ return queue[++*front]; } E rear D C B A front

2.3 다항식 추상 데이터 타입 순서리스트의 표현( 메모리 표현) i. 순차 사상 (sequential mapping) - 물리적 인접성 (arrays) ii.  비순차 사상(non-sequential mapping) - 비연속적 기억장소 위치 - 리스트 : pointers(links)를 가지는 노드 집합

제4장 리스트

리스트의 개요 배열 구조 : 삽입/삭제가 비효율적 리스트 구조 : 포인터 개념을 이용하여 삽입/삭제 연산을 효율적으로 수행 리스트의 구성 : data field & link data field : 실제 자료가 저장 link field : 다음 노드에 대한 포인터가 저장 data data data data link link link link

배열 Int a[7] 3,4 삽입 a[0] 1 a[0] 1 a[0] 1 a[1] 2 a[1] 2 a[1] 2 a[2] 5 6 a[3] a[3] 4 a[4] a[4] 5 a[4] 5 a[5] a[5] 6 a[5] 6 a[6] a[6] a[6]

리스트 3추가 1 1 1 4 4 4 2 2 2 3 3

4.1 포인터 주소를 저장하기위한 공간 선언 : 객체형 * 변수명; 객체사용 예제 : int * ptr; int a; 선언시 “*변수명” 의 의미 => 주소저장공간 객체사용 & : 주소연산자 * : 역참조(간접지시) 연산자 예제 ptr = &a; ptr = a; *ptr = a;

4.1 포인터 int *a1; int a2 = 10; a1 = &a2 *a1 = a2; printf(“%d %d %d %d”,

4.1 포인터 int *a1; int a2 = 10; a1 = &a2 *a1 = a2; printf(“%d %d %d %d”, 1002 1002 a2 10

4.1 포인터 포인터 사용시 주의할점 포인터는 항상 어떤 대상을 가리키고 있어야 함 어떤 대상도 가리키고 있지 않는 포인터는 항상 NULL로 초기화 ‘\n;

4.1 포인터 동적기억장소 할당 => malloc 할당된 메모리 해제 => free free(pi); int i, *pi; float f, *pf; pi = (int *) malloc(sizeof(int)); pf = (float *) malloc(sizeof(float)); *pi = 1024; *pf = 3.14; 할당된 메모리 해제 => free free(pi); free(pf);

4.2 단순연결리스트 연결리스트 : 화살표로 표시된 링크를 가진 노드들의 순열 ptr bat cat sat vat \n

4.2 단순연결리스트 연결리스트의 특징 노드들은 순차적 위치에 존재하지 않는다 노드들의 위치는 실행시마다 바뀔수 있다 bat vat 연결리스트의 특징 노드들은 순차적 위치에 존재하지 않는다 노드들의 위치는 실행시마다 바뀔수 있다 cat sat ptr bat cat sat vat \n

4.2 단순연결리스트 linked list의 활용 스택 / 큐 : 배열구조에 비해서 동적인 상황을 구성 다항식 문제의 해결 트리 및 그래프 구조의 표현 동적인 해싱 구조의 생성 메모리 세그멘테이션의 관리

4.2 단순연결리스트 연결 리스트 구성을 위한 기능 노드의 구조 정의 : struct 노드 생성 방법 : malloc 노드 삭제 방법 : free

4.2 단순연결리스트 예제 [at로 끝나는 단어 리스트] typedef struct list_node *list_pointer; typedef struct list_node { char data[4]; list_pointer link; }; list_pointer ptr = NULL;

4.2 단순연결리스트 공백 리스트 생성 공백 리스트 검사 list_pointer ptr = NULL; #define IS_EMPTY(ptr) (!(ptr))

새 노드 생성 노드 필드에 값 지정 구조 멤버(structure member) 연산자 : ‘->’ ptr bat \n 새 노드 생성 ptr = (list_pointer) malloc(sizeof(list_node)); 노드 필드에 값 지정 구조 멤버(structure member) 연산자 : ‘->’ e->name ≡ (*e).name strcpy(ptr->data,"bat"); ptr->link = NULL;

4.2 단순연결리스트 예제 : 2-노드 연결 리스트 ptr 10 20 \n

typedef struct list_node *list_pointer; typedef struct list_node { ptr 10 20 \n typedef struct list_node *list_pointer; typedef struct list_node { int data; list_pointer link; }; list_pointer ptr = NULL;

list_pointer create2() { /* 두개의 노드를 가진 연결 리스트의 생성 */ ptr 10 20 \n list_pointer create2() { /* 두개의 노드를 가진 연결 리스트의 생성 */ list_pointer first, second; first = (list_pointer) malloc (sizeof(list_node)); second = (list_pointer) malloc (sizeof(list_node)); second->link = NULL; second->data = 20; first->data = 10; first->link = second; return first; }

4.2 단순연결리스트 예제 [리스트 삽입] 함수 호출 : insert(&ptr, node); #define IS_FULL(ptr) (!(ptr)) ptr 10 20 \n 15

void insert(list_pointer *ptr, list_pointer node) { list_pointer temp; temp = (list_pointer) malloc (sizeof(list_node)); if (IS_FULL(temp)){ fprintf(stderr, “The memory is full\n”); exit(1); } temp->data = 15; if (*ptr) { temp->link = node->link; node->link = temp; else { temp->link = NULL; *ptr = temp; node ptr 10 20 \n 15 temp ptr 20 \n

ptr 10 15 20 \n trail node 예제 : 리스트의 삭제 void deleteq(list_pointer *ptr, list_pointer trail, list_pointer node) { /노드삭제, trail은 삭제될 node의 선행노드이며 ptr은 리스트의 시작 */ if (trail) trail->link = node->link; else *ptr=(*ptr)->link; free(node); }

void print_list(list_pointer ptr) { printf(“The list contains : “); 10 15 20 \n 예제 : 리스트의 출력 void print_list(list_pointer ptr) { printf(“The list contains : “); for ( ; ptr; ptr=ptr->link) printf(“%4d”, ptr->data); printf(“\n”); }

4.2 단순연결리스트 연습문제 : 리스트에 포함된 노드의 수 int list_length(list_pointer ptr) { int len =0; while (ptr) { len++; ptr = ptr ->link; } return len; ptr 10 15 20 \n

연습문제 : 자료의 탐색 list-pointer list_search(list_pointer ptr, char *data) { 10 15 20 \n 연습문제 : 자료의 탐색 list-pointer list_search(list_pointer ptr, char *data) { while(ptr) { if (!strcmp(ptr->data, data)) return ptr else ptr = ptr->link; } return NULL;

4.3 동적연결 스택과 큐 \n front rear 10 10 15 20 \n top

4.3 동적연결 스택과 큐 스택과 큐에 대한 함수 작성 isFull isEmpty Add Delete

4.3 동적연결 스택과 큐 스택 #define MAX_STACKS 10 /*스택의 최대 원소수 */ typedef struct { int key; /*기타필드*/ }element; typedef struct stack *stack_pointer; typedef struct stack { element item; stack_pointer link; }; Stack_pointer top; Stack_pointer mtop[MAX_STACKS]; top mtop[0] mtop[1] mtop[2] mtop[3] mtop[4]

4.3 동적연결 스택과 큐 스택의 초기 조건 top[i]=NULL, 0≤i<MAX_STACKS 경계 조건 i번째 스택이 공백이면, top[i]=NULL 메모리가 가득차면, IS_FULL(temp)

4.3 동적연결 스택과 큐 add(&top[stack_no],item); item=delete(&top[stack_no]);

4.3 동적연결 스택과 큐 void add(stack_pointer *top, element item) { /*스택의 톱에 원소를 삽입*/ stack_pointer temp=(stack_pointer) malloc(sizeof(stack)); if (IS_FULL(temp)){ fprintf(stderr,”The memory is full\n”); exit(1); } temp->item = item; temp->link = *top; *top = temp; \n top

4.3 동적연결 스택과 큐 element delete(stack_pointer *top) { /*스택으로부터 원소를 삭제*/ stack_pointer temp = *top; element item; if (IS_EMPTY(temp)){ fprintf(stderr,”The stack is empty\n”); exit(1); } item = temp->item; *top = temp->link; free(temp); return item; \n top

4.3 동적연결 스택과 큐 큐 #define MAX_QUEUES 10 /*큐의 최대원소수*/ typedef struct queue *queue_pointer; typedef struct queue{ element item; queue_pointer link; } queue_pointer front,rear; queue_pointer m_front[MAX_QUEUES],m_rear[MAX_QUEUES];

4.3 동적연결 스택과 큐 초기조건 front[i]=NULL, 0<=i<MAX_QUEUES 경계조건 i번째 큐가 공백이면, front[i]=NULL 메모리가 가득차기만하면, IS_FULL(temp);

4.3 동적연결 스택과 큐 addq(&front,&rear,item); item=deleteq(&front);

front rear 10 10 15 20 \n void addq(queue_pointer *front, queue_pointer *rear, element item) { /*큐의 rear에 원소를 삽입*/ queue_pointer temp = (queue_pointer) malloc(sizeof (queue)); if(IS_FULL(temp)){ fprintf(stderr,”The memory is full\n”); exit(1); } temp->item = item; temp->link = NULL; if (*front) *rear->link = temp; else *front = temp; *rear = temp;

front rear 10 10 15 20 \n element deleteq(queue_pointer *front) { /*큐에서 원소를 삭제*/ queue_pointer temp = *front; element item; if (IS_EMPTY(*front)){ fprintf(stderr,”The queue is empty\n”); exit(1); } item = temp->item; *front = temp->link; free(temp); return item;

과제물 리스트를 이용한 동적 스택구현 리스트를 이용한 동적 큐 구현