티스토리 뷰
[소스 코딩]
■ ArrayBaseStack.h
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 | #ifndef __AB_STACK_H__ #define __AB_STACK_H__ #define TRUE 1 #define FALSE 0 #define STACK_LEN 100 typedef int Data; // 사용자 정의 int형 Data 선언 typedef struct _arrayStack // 사용자 정의 구조체 'ArrayStack' 정의 { Data stackArr[STACK_LEN]; // 100의 배열 구조를 갖는 스택 선언 int topIndex; // 가장 위(마지막 데이터)를 가리키는 topIndex 선언 } ArrayStack; typedef ArrayStack Stack; // 'ArrayStack'이름을 Stack으로 변경 void StackInit(Stack * pstack); // 스택을 초기화 하는 함수 int SIsEmpty(Stack * pstack); // 스택에 데이터가 비어있는지 확인하는 함수 void SPush(Stack * pstack, Data data); // 스택에 데이터를 삽입하는 함수 Data SPop(Stack * pstack); // 스택에서 데이터를 추출하는 함수 Data SPeek(Stack * pstack); // 스택의 데이터를 확인하는 함수 #endif | cs |
■ 각 함수의 정의
// 스택을 초기화 하는 함수 // void StackInit(Stack * pstack) { pstack->topIndex = -1; } | cs |
- 데이터가 비어 있는 상태를 의미하기 위해 'topIndex를 -1'로 선언
// 스택에 데이터가 비어있는지 확인하는 함수 // int SIsEmpty(Stack * pstack) { if(pstack->topIndex == -1) return TRUE; else return FALSE; } | cs |
- '데이터가 비워져 있으면 TRUE'를 반환
- '데이터가 존재하면 FALSE'를 반환
// 스택에 데이터를 삽입하는 함수 // void SPush(Stack * pstack, Data data) { pstack->topIndex += 1; pstack->stackArr[pstack->topIndex] = data; } | cs |
- topIndex를 먼저 1 증가
※ 최초의 경우 배열 0번째를 지정
- 변경된 topIndex 위치에 입력 받은 데이터를 저장
// 스택에서 데이터를 추출하는 함수 Data SPop(Stack * pstack) { int rIdx; if(SIsEmpty(pstack)) { printf("Stack Memory Error!"); exit(-1); } rIdx = pstack->topIndex; pstack->topIndex -= 1; return pstack->stackArr[rIdx]; } | cs |
- 삭제할 데이터가 저장된 배열 인덱스를 저장하기 위한 'rIdx' 변수 선언
- 데이터가 비워져 있는 상태라면 "Stack Memory Error!"를 출력하고 함수 종료
- rIdx 변수에 현재 가리키는 topIndex를 저장
- 데이터가 삭제될 것이기 때문에 topIndex를 -1 감소
- 스택 배열의 rIdx 번째 인덱스를 반환
// 스택의 데이터를 확인하는 함수 Data SPeek(Stack * pstack) { if(SIsEmpty(pstack)) { printf("Stack Memory Error!"); exit(-1); } return pstack->stackArr[pstack->topIndex]; } | cs |
- 데이터가 비워져 있는 상태라면 "Stack Memory Error!"를 출력하고 함수 종료
- 스택 배열의 (마지막에 저장된) topIndex 값을 반환
■ ArrayBaseStack.c
#include <stdio.h> #include <stdlib.h> #include "ArrayBaseStack.h" // 스택을 초기화 하는 함수 // void StackInit(Stack * pstack) { pstack->topIndex = -1; } // 스택에 데이터가 비어있는지 확인하는 함수 // int SIsEmpty(Stack * pstack) { if(pstack->topIndex == -1) return TRUE; else return FALSE; } // 스택에 데이터를 삽입하는 함수 // void SPush(Stack * pstack, Data data) { pstack->topIndex += 1; pstack->stackArr[pstack->topIndex] = data; } // 스택에서 데이터를 추출하는 함수 Data SPop(Stack * pstack) { int rIdx; if(SIsEmpty(pstack)) { printf("Stack Memory Error!"); exit(-1); } rIdx = pstack->topIndex; pstack->topIndex -= 1; return pstack->stackArr[rIdx]; } // 스택의 데이터를 확인하는 함수 Data SPeek(Stack * pstack) { if(SIsEmpty(pstack)) { printf("Stack Memory Error!"); exit(-1); } return pstack->stackArr[pstack->topIndex]; } | cs |
■ ArrayBaseStackMain.c
#include <stdio.h> #include "ArrayBaseStack.h" int main(void) { // Stack의 생성 및 초기화 /////// Stack stack; StackInit(&stack); // 데이터 넣기 /////// SPush(&stack, 1); SPush(&stack, 2); SPush(&stack, 3); SPush(&stack, 4); SPush(&stack, 5); // 데이터 조회 /////// printf("마지막에 저장된 데이터: %d \n\n", SPeek(&stack)); // 데이터 꺼내기 /////// printf("저장된 데이터 출력: "); while(!SIsEmpty(&stack)) printf("%d ", SPop(&stack)); return 0; } | cs |
- 데이터 삽입 순서(1 → 2 → 3 → 4 → 5)
- 마지막에 저장된 데이터 조회: SPeek(&stack) 함수 호출
- 저장된 데이터 출력: SIsEmpty 함수를 호출하여 반환된 값이 'TRUE가 아니면'(=FALSE) SPop 함수 호출 반복
■ 실행 결과
'자료구조' 카테고리의 다른 글
[ch 06-4] 계산기 프로그램 구현_3(후위표기법 수식 계산 개념) (0) | 2016.04.06 |
---|---|
[ch 06-4] 계산기 프로그램 구현_2(중위표기법->후위표기법 변환 구현) (3) | 2016.04.06 |
[ch 06-4] 계산기 프로그램 구현_1(전위/중위/후위표기법 개념) (0) | 2016.04.05 |
[ch 06-3] 스택의 연결 리스트 기반 구현 (0) | 2016.03.30 |
[ch 06-1] 스택의 이해와 ADT 정의 (0) | 2016.03.30 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 스택
- System
- 일기
- java
- 대상
- 응용
- 설명
- 왕초보 영어회화 100일의 기적
- ADODB
- 알고리즘
- wfd
- tdataset
- 자료구조
- 상황
- Delphi
- 교육센터
- RA
- SysUtils
- 말하기
- 작문
- 정렬
- SWT
- Pte
- VCL
- 독해
- 영어
- 계산기
- Reference
- 문법
- 여행영어 100일의 기적
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함