<BCBCB9CCB3AA20C0DAB7E1202D20BDBAC5C3C5A52E687770>

Similar documents
untitled

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

Chapter 4. LISTS

슬라이드 1

03_queue

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

Microsoft PowerPoint - 08-chap06-Queue.ppt

슬라이드 1

슬라이드 1

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

Microsoft PowerPoint - 08-Queue.ppt

03장.스택.key

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

chap x: G입력

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

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

Algorithms

슬라이드 1

11장 포인터

슬라이드 1

PowerPoint 프레젠테이션

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

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

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070>

04장.큐

Microsoft PowerPoint - 07-chap05-Stack.ppt

Chapter 4. LISTS

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

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

버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습

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

Microsoft Word - FunctionCall

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

chap 5: Trees

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - ch08_큐 [호환 모드]

untitled

03장.스택

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

chap x: G입력

Chap 6: Graphs

4장

untitled

C 언어 프로그래밊 과제 풀이

1장. 유닉스 시스템 프로그래밍 개요

Microsoft PowerPoint - chap06-1Array.ppt

Microsoft PowerPoint - 자료구조2008Chap06

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

슬라이드 1

본 강의에 들어가기 전


슬라이드 1

슬라이드 1

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap10-함수의활용.pptx

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

untitled

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

Microsoft PowerPoint - chap11-포인터의활용.pptx

PowerPoint 프레젠테이션

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

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

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

Microsoft PowerPoint - chap05-제어문.pptx

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

PowerPoint 프레젠테이션

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

Microsoft PowerPoint - chap01-C언어개요.pptx

C++ Programming

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

슬라이드 1

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

1장. 리스트

Microsoft PowerPoint - chap03-변수와데이터형.pptx

슬라이드 1

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

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

06장.리스트

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

ABC 10장

제 3 장 스택과 큐

슬라이드 1

PowerPoint 프레젠테이션

중간고사 (자료 구조)

Microsoft PowerPoint - ch07 - 포인터 pm0415

Lab 5. 실습문제 (Double linked list)-1_해답.hwp

Microsoft PowerPoint - chap06-5 [호환 모드]

PowerPoint 프레젠테이션

05_tree

K&R2 Reference Manual 번역본

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

Microsoft PowerPoint - chap12-고급기능.pptx

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

슬라이드 1

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

<4D F736F F F696E74202D20C1A637C0E52DB0EDB1DEBFACB0E1B8AEBDBAC6AE2E >

C 프로그래밊 개요

Transcription:

스택과큐 (Stack, Queue) 이현환 (NOON) haonun@gmail.com http://noon.tistory.com --------------------------------------------------- - 1 -

목차 --------------------------------------------------- 서론 1. 스택과큐를왜알아야할까? 03 Page 본론 2. 스택 04 Page 3. C로알아보는스택. 05 Page 4. 큐 08 Page 5. C로알아보는큐. 08 Page 6. 응용 11 Page 결론 7. 결론 13 Page 참고문헌 - 2 -

서론 스택과큐를왜알아야할까? 스택과큐는자료구조유형중가장많이쓰이는자료구조유형입니다. 그럼자료구조란무엇인가.. 하면데이터를컴퓨터내부에서표현하는방법입니다. 컴퓨터에는무수히많은데이터가들어가는데이를좀더효율적으로관리하기위해만들어진것이스택, 큐와같은자료구조유형이지요. 스택과큐는컴퓨터의많은부분을차지합니다. 평소에들을수있는스택오버플로우라던지윈도우메시지큐라던지신경안쓰고있던부분에깊숙이침투해있습니다. 그럼이제컴퓨터의기초자료구조인스택과큐의구조에대해알아보겠습니다. - 3 -

본론 2. 스택 스택은차곡차곡쌓이는형태입니다. 그러나출력시가장마지막에쌓인데이터부터출력을하게됩니다. 그래서스택을선입후출, 즉 FILO(First in Last out), LIFO(Last in First out) 라고도합니다. 스택에데이터가들어가는모습을보겟습니다. 일단스택의개념을이해하기위해책을쌓듯이표현했습니다. DATA [2] DATA [0] 스택 (Stack) DATA [1] DATA [0] 스택 (Stack) DATA [1] DATA [0] 스택 (Stack) 1. 처음에스택에 0번데이터가들어갔습니다. 2. 이어서 1번데이터가들어옵니다. 그림과같이위에책을쌓는다고생각하시면됩니다. 3. 2번데이터가들어옵니다. 마찬가지로쌓입니다. 이런식으로스택에데이터가쌓이게되고필요시꺼내서사용하게되는겁니다. 스택은선입후출방식입니다. 먼저들어간데이터가가장나중에나오게되는거죠. 그럼세번째상황후 DATA[0] 을사용하려면할까요? 정답은 1번과 2번데이터를뺀후에사용하게됩니다. 그럼간단하게스택에서쓰이는용어들에대해알아보겠습니다. 주요용어 3개입니다. TOP : 스택의맨위쪽을가리킴 POP 데이터의삭제 PUSH 데이터의삽입 DATA [2] DATA [1] DATA [0] 스택 (Stack) - 4 -

TOP 은그림에서의스택의맨위즉가장최근에들어온데이터를가리키게됩니다. 데이터가입력되고삭제될떄 TOP이움직이면서현재스택안의데이터가어디까지저장되어있는지위치를알려줍니다. POP은스택의연산에서데이터를삭제하기위한것입니다. TOP의위치를그전데이터를가리키면서이전에있던데이터가삭제되는것입니다. DATA [2] DATA [1] DATA [0] 스택 (Stack) PUSH는위와반대로데이터의삽입을하기위한것입니다. POP와반대로 TOP이다음데이터가들어올자리로이동한후그자리에데이터를삽입하게됩니다. 3. C 로알아보는스택 C 로구현해본스택입니다. #include <stdio.h> #define MAX_STACK_SIZE 10 // 사용할스택의사이즈입니다. typedef struct // 구조체타입선언 element int key; char grade; element; int top = -1; element stack[max_stack_size]; // 스택이라는이름으로 element선언 element pop(); void push(element data); void main() element data; int i, n, cond = 1; i=0; while(cond) printf("insert Data[int, char] : "); scanf("%d %c",&data.key,&data.grade); // 데이터를입력받음 if(data.key!= 0) - 5 -

push(data); i++; printf(" 데이터를계속입력하시겠습니까?[Y=1/N=0]"); scanf("%d",&cond); printf(" 스택에서몇개의데이터를출력하시겠습니까? : "); scanf("%d",&n); printf(" 스택에서삭제된데이터 : n"); for(i=0;i<n;i++) data = pop(); printf("%d t%c n",data.key,data.grade); void push(element item) // 데이터삽입 if(top >= MAX_STACK_SIZE -1) printf("overflow. n"); else top++; // TOP의위치를증가시켜다음데이터가들어올주소를가리킴 stack[top] = item; // TOP이가리키는곳에데이터삽입. element pop() if(top == -1) printf("empty n"); else return stack[top--]; // 삭제를위하여 TOP를감소함 - 6 -

stack.c 에스택을구현한소스를입력하였습니다. 컴파일후 생성된스크립트를실행하여스택에데이터를삽입하고꺼낼데이터의수를정해데이터를꺼내면서삭제하는과정을볼수있습니다. - 7 -

4. 큐 큐는데이터가들어오는곳과나가는곳이다른자료구조입니다. 큐는데이터가쌓이다가데이터가나가야할때가장먼저들어온데이터가나가게됩니다. 선입선출, 즉 FIFO(First in First out) 이라고표기합니다. frount는큐의맨앞을가리킵니다. 가장오래된데이터를나타냅니다. rear은큐의맨뒤를가리킵니다. 즉가장최근에들어온데이터를가리키고있습니다. addq는큐에데이터를삽입합니다. rear을움직여큐공간을확보한후데이터를집어넣습니다. deleteq는큐에서삭제합니다. frount를움직여서가장오래된데이터를다음번째데이터로넘기게됩니다. A rear B A rear fron C B A rear fron D C B A rear fron D C B rear fron fron 5. C 로알아보는큐 C 로구현한큐입니다. #include <stdio.h> #define MAX_QUEUE_SIZE 10 // 큐의사이즈를지정하였습니다. typedef struct // 구조체선언 int job_num; char grade; element; int rear = -1; // rear 과 front를 -1로잡아큐가비엇다는것을증명합니다. int front = -1; void addq(element item); - 8 -

element queue[max_queue_size]; element deleteq(); void main() int i, job_num, out, gradea=0; element temp; printf(" 오늘의작업수는?"); scanf("%d",&job_num); printf(" 작업번호 [ 정수 ] 와작업상태 [ 대문자알파벳 ] 입력 n"); for(i=0;i<job_num;i++) scanf("%d %c",&temp.job_num,&temp.grade); // 입력값을 temp에저장 addq(temp); printf(" n nfront = %d rear = %d n n",front,rear); for(i=0;i<job_num;i++) temp = deleteq(); if(temp.grade == 'A') printf("%d t%c n",temp.job_num,temp.grade); gradea++; else addq(temp); printf("a 등급의작업의갯수. n",gradea); printf(" n nfront = %d rear = %d n n",front,rear); // akw void addq(element item) if(rear == MAX_QUEUE_SIZE -1) printf("queue is full n"); // 큐의 overflow를확인 else queue[++rear] = item; //rear을증가시켜데이터를삽입 element deleteq() if(front == rear) printf("empty"); - 9 -

else return queue[++front]; //front를증가시켜맨끝정보를지나침 ------------------------------------------------------------------- queue.c 에소스를입력합니다. 이번에작성한프로그램은작업의질을평가하는간단한소스입니다. 맨처음작업개수를입력하면작업개수만큼큐에입력을받습니다. 들어가는데이터는작업번호와작업등급 ( 예 A B C D F ) 을받습니다. 출력을하면서큐의데이터를삭제하고 A등급의개수를보여줍니다. 실행화면입니다. - 10 -

6. 응용 위에서간단하게알아본스택, 큐가어디에쓰이는지좀더알아볼까합니다. 먼저스택은선입후출의자료구조입니다. 먼저들어간데이터가가장늦게나오게됩니다. 컴퓨터내부의여러가지현상과함수호출등에들어가게됩니다. 한가지를예를들어알아보겠습니다. 프로그램은간단하게나타내면비교와함수의호출로이루어집니다. 함수안에서함수가실행된다고보았을때스택과많은점이일치하게됩니다. int main() fun1(); return N0; int fun1() fun2(); return N1; int fun2() fun3(); return N2; int fun3() return N3; 이런식으로함수가구성이생각하고풀어가겠습니다. 1. 메인함수가실행되며 fun1을실행합니다. 2. fun1 에선 fun2를실행합니다. 3. fun2 에선 fun3을실행합니다. 4. fun3에서내용을처리한후 N3을반환합니다. 5. fun2로넘어가 N2를반환합니다. - 11 -

6. fun1로넘어가 N1을반환합니다. 7. main으로넘어가 N0을반환하고마칩니다. 로직을보면한가지눈에띄는것이보입니다. 반환값의순서가 3 ->2 ->1 -> 0 의순서입니다. 함수가종료된후에전에왔던구문까지한번에넘어와야합니다. 함수가실행될때마다프로그램을처음부터실행할수는없습니다. 그래서현재상태의변수, 메모리, 복귀주소등을스택에저장한후함수를호출하게됩니다. 이번에는배운스택의내용을적용시켜서한번보겠습니다. int main() fun1(); return N0; int fun1() fun2(); return N1; int fun2() fun3(); return N2; int fun3() return N3; 1. 메인함수가실행되며 fun1을실행합니다. // 스택에는 fun1을실행하기전의복귀주소, 변수등데이터가들어갑니다. 2. fun1 에선 fun2를실행합니다. // 스택에는 fun2를실행하기전의복귀주소, 변수등데이터가들어갑니다. 3. fun2 에선 fun3을실행합니다. // 스택에는 fun3를실행하기전의복귀주소, 변수등데이터가들어갑니다. 4. fun3에서내용을처리한후 N3을반환합니다. // 스택에있는복귀주소를이용하여 fun2까지실행된상태로넘어갑니다. 5. fun2로넘어가 N2를반환합니다. // 스택에있는데이터로 fun1까지넘어갑니다. 6. fun1로넘어가 N1을반환합니다. // 스택에있는데이터로 fun1실행전의메인함수로넘어갑니다. 7. main으로넘어가 N0을반환하고마칩니다. // 프로그램을종료하고데이터를반환합니다. 스택에는프로그램의여러중요한정보가들어가게됩니다. 공부하시면서오버플로우공격중스택버퍼오버플로우라는기법을들어보셨을겁니다. 이오버플로우기법은 UID 즉권한을사용하는프로그램이오버플로우에대한예외처리나대체법을해놓지않은상태에서입력값을오버시켜스택에있는복귀주소 (RET) 을건드려공격자가원하는방향으로스크립트를실행하여권한을얻어올수도있습니다. 이런공격기법들은리버싱등여러가지지식을요하는데이중스택에대한정보도확실하게알아둔다면 - 12 -

그에따라예방책을세우는데좀더유리하게세울수있을것이라믿습니다. 또한, 스택과큐를이용하여좀더효율적인프로그래밍을할수있으며컴퓨터의기본원리를조금씩이해하기적합하다고생각하였습니다. 결론 7. 결론 이글을보시는분들중에는스택과큐에대해알고있는분도, 또는처음접하는분들도있을겁니다. 스택과큐는현재컴퓨터를구성하는기본적인자료구조이기에관련전공자는기본으로알고들어갈개념이라고생각합니다. 알고있다하더라도이글을통해복습과엣기억을되짚어볼수있는기회가되고처음접하신분들에게유용한문서가되었으면하는바램입니다. 참고문헌 프로그래밍속의자료구조 [ 이현숙저 ] - 13 -