티스토리 뷰
구현 소스
ArrayStack.h
#ifndef ARRAYSTACK_H #define ARRAYSTACKT_H #include <stdio.h> #include <stdlib.h> typedef int ElementType; // 데이터를 가지는 Node 구조체 선언 typedef struct tagNode{ ElementType Data; }Node; // 스택 구조체 선언 typedef struct tagArrayStack{ int Capacity; // 배열로 구현하기 때문에 전체 용량을 제한함 int Top; // 가장 최근에 들어온 데이터의 인덱스를 가지는 Top Node* Nodes; // 데이터 }ArrayStack; void AS_CreateStack(ArrayStack** Stack, int Capacity); // stack을 만드는 함수 void AS_DestroyStack(ArrayStack* Stack); // stack의 메모리를 해제하는 함수 void AS_Push(ArrayStack* Stack, ElementType Data); // stack의 Push 연산 수행 ElementType AS_Pop(ArrayStack* Stack); // stack의 Pop 연산 수행 ElementType AS_Top(ArrayStack* Stack); // stack의 최상위 데이터를 얻는 함수 int AS_GetSize(ArrayStack* Stack); // stack의 현재 데이터 개수를 얻는 함수 int AS_IsEmpty(ArrayStack* Stack); // stack이 비어있는 여부를 검사하는함수. // 비타민 퀴즈 추가 함수 - 스택이 가득 차 있는지 체크하는 함수 int AS_IsFull(ArrayStack* Stack); #endif ---------------------------------------------------------------------------------
ArrayStack.cpp
#include "ArrayStack.h" // stack을 만드는 함수 void AS_CreateStack(ArrayStack** Stack, int Capacity){ (*Stack) = (ArrayStack*) malloc(sizeof(ArrayStack)); // ArrayStack 구조체 타입의 stack의 메모리를 할당하고 (*Stack)->Nodes = (Node*) malloc(sizeof(Node) * Capacity); // stack의 맴버인 Nodes는 Node* 형 변수이므로 마찬가지로 Capacity만큼 메모리 할당 (*Stack)->Capacity = Capacity; // stack의 용량 저장 (*Stack)->Top = 0; // 초기생성시 top을 0으로 초기화 한다. } // stack의 메모리를 해제하는 함수 void AS_DestroyStack(ArrayStack* Stack){ free(Stack->Nodes); // 먼저 Capacity에 따라 동적할당되는 Nodes의 메모리를 해제후 free(Stack); // Stack을 해제한다. } // stack의 Push 연산 수행 - 자체제작 예외처리 - 스텍이 가득 차 있는 경우 에러메시지 발생 void AS_Push(ArrayStack* Stack, ElementType Data){ int Position = Stack->Top; // Top은 삽입될 데이터의 인덱스를 가리키므로 (초기값0) if( !(AS_IsFull(Stack)) ){ // Nodes[Stack->Top].Data 에 해당하는곳에 데이터 삽입 Stack->Nodes[Position].Data =Data; // 데이터 저장이 끝나면 Top을 +1 증가 시킨다. printf("Data : %d is pushed || ",Data); (Stack->Top)++; } else{ printf("**** Error - Stack Is Full !! ****\n"); return ; } } // stack의 Pop 연산 수행 - 추가 예외처리 - 스택이 비어있는 경우 에러메시지 발생 ElementType AS_Pop(ArrayStack* Stack){ int Position; // Top은 삽입될 데이터의 인덱스를 가리키므로 -1 해줘야 현재 Top인 데이터의 인덱스를 얻을수 있다. // ex) Nodes[0]에 데이터가 저장되어있으면 현재의 Top은 1, 따라서 Nodes[0]의 데이터를 Pop시키기 위해선 // Nodes[Top-1]의 데이터를 찾으면 됨 // Stack->Top의 값은 -1 되어 새로운 최상위 데이터값의 인덱스를 가리킬수 있게 한다. if(! (AS_IsEmpty(Stack)) ){ Position = --(Stack->Top); printf("Data : %d is popped ", Stack->Nodes[Position].Data); return Stack->Nodes[Position].Data; } else{ printf("**** Error - Stack Is Empty ****\n"); return 0; } } // stack의 최상위 데이터를 얻는 함수 - 추가 예외처리 - 스택이 비어있는 경우 에러메시지 발생 ElementType AS_Top(ArrayStack* Stack){ int Position = Stack->Top-1; if(!AS_IsEmpty(Stack)) return Stack->Nodes[Position].Data; // return Stack->Nodes[(Stack->Top)-1].Data; else{ printf("**** Error - Stack Is Empty ****\n"); return 0; } } // stack의 현재 데이터 개수를 얻는 함수 int AS_GetSize(ArrayStack* Stack){ return Stack->Top; // 데이터의 개수는 Top의 값과 같다. } // stack이 비어있는 여부를 검사하는함수. int AS_IsEmpty(ArrayStack* Stack){ return ( (Stack->Top)==0 ); // Stack->Top이 0이라면 1, 아니면 0을 리턴 } // 비타민 퀴즈 추가 함수 - 스택이 가득 차 있는지 체크하는 함수 int AS_IsFull(ArrayStack* Stack){ return (Stack->Top) == (Stack->Capacity); // Top이 Capacity와 같으면 데이터가 가득 차 있다는 뜻과 같다. }
---------------------------------------------------------------------------
main.cpp
#include "ArrayStack.h" int main(){ int i=0; ArrayStack* Stack = NULL; AS_CreateStack(&Stack,10); // Capacity가 10인 Stack 생성 for(i=0;i<10;i++){ AS_Push(Stack,i); printf("Current Top : %d\n", Stack->Top); }// Push 연산 10회 수행 AS_Push(Stack,i); // 용량이 초과됐을때의 예외 처리 확인 for(i=0;i<10;i++){ AS_Pop(Stack); printf("Current Top : %d\n", Stack->Top); }// Pop 연산 10회 수행 AS_Pop(Stack); // 비어있는 Stack에 Pop연산을 수행했을시 예외처리 확인 AS_DestroyStack(Stack); return 0; } -----------------------------------------------------------------------------------
실행결과
'Programming > 뇌를 자극하는 알고리즘' 카테고리의 다른 글
뇌를 자극하는 알고리즘 - 3. 큐 : 순환 큐 (0) | 2010.10.05 |
---|---|
뇌를 자극하는 알고리즘 2. 스택 - Linked List Stack (0) | 2010.10.02 |
뇌를 자극하는 알고리즘 1. 리스트 - Circle Double Linked List (2) | 2010.10.01 |
뇌를 자극하는 알고리즘 1. 리스트 - Double Linked List (0) | 2010.10.01 |
뇌를 자극하는 알고리즘 1. 리스트 - Single Linked List (4) | 2010.09.29 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Tales of the Float Land
- Hash table
- Linked list
- quick sort
- PackMan
- Win32 API
- Queue
- Kinect Game Project
- 윈도우즈 API 정복
- 그림 맞추기 게임
- Tree
- 열혈강의C
- 뇌를 자극하는 알고리즘
- Farseer Physics
- IntersectRect
- Pixel 색상값으로 구현한 간단한 충돌
- Kinect Programming
- WM_TIMER
- WM_CONTEXTMENU
- 2D Game Project
- SetTimer
- Ice Climber
- Stack
- Digits Folding
- Game project
- MFC 예제
- Data Structures in C
- PtInRect
- WinAPI
- graph
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
글 보관함