C언어 응용 제7주 실습 해보기 제6장
예제 6-1 실습하기 순차자료구조를 이용한 스택구현 순차자료구조를 이용한 스택을 구현하고 이와 연 관된 함수를 구현한다. 순차자료구조를 이용한 스택을 구현한 소스파일과 헤더파일을 따로 작성한다. 구현한 함수 목록 push : 스택에 자료 추가하기 pop : 스택에서 자료 꺼내오기 peek : 스택의 최상위 자료 읽기 del : 스택의 최상위 자료 삭제 printStack : 스택 출력
소스 목록 및 내용 arraystack.h : 스택구현에 필요한 자료형과 함수 의 원형을 선언하는 헤더 파일 arraystack.c : 스택 구현에 필요한 함수의 내용을 작성한 소스 ex0601.c : 스택을 테스트하는 main 소스 파일
실습하는 순서 Eclipse 를 실행한다. Workspace와 Perspective가 맞는지 확인 하고 맞지 않으면 수정한다. Workspace 는 D:\Lec_hwlee\Capp\y2014 이고 Perspective 는 C/C++ 이어야 한다. 프로젝트 생성 arraystack.h 파일 작성 arraystack.c 파일 작성 ex0601.c 작성 빌드 및 실행 결과 확인
소스들 사이의 연관 관계 arraystack.h ex0601.c 연결리스트 구현에 필요한 구조체와 필요한 함수의 원형을 선언한다. ex0601.c 구현된 연결리스트를 테스트 해보는 main 소스 포함한다. 포함한다. 실제 함수를 호출하여 사용한다. arraystack.c 연결리스트 구현에 필요한 함수의 내용을 작성한다.
필요한 함수 리턴 타입 함수명 매개변수 기능 void push int 새로운 원소를 스택에 추가 한다. pop 스택의 최상위 자료를 꺼내 온다. del 스택의 최상위 자료를 삭제한다. peek 스택의 최상위 자료를 읽는다. printStack 스택을 출력한다.
함수 가상 코드 push(int data) top ← top + 1; if ( top > STACK_SIZE) then overflow; else S(top) ← data; End push
함수 가상 코드 pop() if( top = 0) then underflow; else { temp ← S(top); top ← top - 1 ; return temp; } End pop
함수 가상 코드 del() if( top = 0) then underflow; else { top ← top - 1 ; } End del
함수 가상 코드 peek() if( top = 0) then underflow; else { temp ← S(top); return temp; } End pop
함수 가상 코드 printStack() write “STACK [“; for (i←0; i<=top; i++) do { write S(i) +” ”; } write “] \n”; End printStack
main 소스 코드 스택을 만들고 구현한 함수들이 정상 동작하는지 를 테스트하는 코드를 작성한다. 스택에 1,2,3을 추가한 후 peek, del, pop을 사용 하여 다시 제거한다.
main 의 가상 코드 write message PrintStack(); Push(1); Push(2); Push(3);
main 의 가상 코드 Peek(); PrintStack(); Del(); Pop();
Eclipse 실행 D:\Lec_hwl\CApp\y2014
Eclipse 실행
Workspace 확인 D:\Lec_hwl\CApp\y2014
CDT Perspective 확인 이 버튼을 클릭해서 수정 Java EE 로 되어 있음
CDT Perspective 확인 C/C++ 선택
CDT Perspective 확인 C/C++ 로 되어 있음
새 프로젝트 생성 File->New->C Project 반드시 C Project를 택할 것
프로젝트 명 설정 Ch06Ex01 Empty Project Cygwin GCC D:\Lec_hwl\capp\y2014\Ch06Ex01
프로젝트 구성 설정 Debug 버전과 Release 버전 모두 사용
생성된 빈 프로젝트
arraystack.h 추가 및 작성 Header File 선택
arraystack.h 추가 및 작성 arraystack.h 헤더 파일 명 설정
arraystack.h 추가 및 작성 자동 생성된 빈 헤더 파일 헤더가 여러 소스에서 포함되었을 때 이중으로 포함되지 않도록 하는 매크로 실제 헤더의 내용이 들어갈 위치
arraystack.h 추가 및 작성 스택 크기 및 함수 원형 선언 STACK_SIZE 매크로 상수 선언
linkedlist.c 추가 및 작성 Source File 선택
arraystack.c 추가 및 작성 Ch06Ex01 프로젝트명 확인 arraystack.c 소스 파일명 설정
arraystack.c 추가 및 작성 자동 생성된 빈 소스 파일
arraystack.c 추가 및 작성 필요한 코드 작성(빈 함수 작성) 표준 입출력 함수 헤더 배열로 구현한 스택관련 함수 헤더 스택을 위한 메모리 할당 Top을 전역변수로 선언하고, -1로 초기화한다. 필요한 각 함수의 원형에 맞게 함수의 몸체를 작성하되, 내용은 모두 빈 것으로 작성한다. 차후에 한 함수씩 코드의 내용을 작성한다.
void push(int data)
int pop()
int peek()
void del()
void printStack()
ex0601.c 추가 및 작성 Source File 선택
ex0601.c 추가 및 작성 Ch06Ex01 프로젝트명 확인 ex0601.c 소스 파일명 설정
추가된 빈 소스 파일 프로젝트에 3 개의 파일 ex0601.c, arraystack.c, arraystack.h 가 추가된 것을 확인할 수 있다.
main 함수 작성 빈 main 함수 작성 표준 입출력 함수 헤더 배열 스택 관련 함수 헤더
main 함수 작성
main 함수 작성
main 함수 작성
빌드 및 실행 결과
도전 문제 스택의 자료를 문자로 저장하도록 하여 사용자가 입력한 문자열을 뒤집어서 출력하는 프로그램을 스택을 이용하여 작성하시오. 배열을 사용한 스택을 작성하되 스택의 크기를 사 용자가 임의로 정하여 할 수 있도록 프로그램을 수 정하시오.
예제 6-2 실습하기 단순연결자료구조를 이용한 스택구현 단순연결자료구조를 이용한 스택을 구현하고 이와 연관된 함수를 구현한다. 단순연결자료구조를 이용한 스택을 구현하고 이와 연관된 함수를 구현한다. 단순연결자료구조를 이용한 스택을 구현한 소스파 일과 헤더파일을 따로 작성한다. 구현한 함수 목록 push : 스택에 자료 추가하기 pop : 스택에서 자료 꺼내오기 peek : 스택의 최상위 자료 읽기 del : 스택의 최상위 자료 삭제 printStack : 스택 출력
소스 목록 및 내용 liststack.h : 스택구현에 필요한 자료형과 함수의 원형을 선언하는 헤더 파일 liststack.c : 스택 구현에 필요한 자료형과 함수의 내용을 작성한 소스 ex0602.c : 스택을 테스트하는 main 소스 파일
실습하는 순서 Eclipse 를 실행한다. Workspace와 Perspective가 맞는지 확인 하고 맞지 않으면 수정한다. Workspace 는 D:\Lec_hwlee\Capp\y2014 이고 Perspective 는 C/C++ 이어야 한다. 프로젝트 생성 liststack.h 파일 작성 liststack.c 파일 작성 ex0602.c 작성 빌드 및 실행 결과 확인
소스들 사이의 연관 관계 liststack.h ex0602.c 연결리스트 구현에 필요한 구조체와 필요한 함수의 원형을 선언한다. ex0602.c 구현된 연결리스트를 테스트 해보는 main 소스 포함한다. 포함한다. 실제 함수를 호출하여 사용한다. liststack.c 연결리스트 구현에 필요한 함수의 내용을 작성한다.
이전 예제와의 차이점 단순 연결자료구조를 사용하므로 빈 스택을 생성 하는 함수가 필요하다. 사용을 종료한 스택이 차지하고 있는 메모리를 반 환하는 함수가 필요하다. push 에서 자료를 저장하기 위한 노드를 위한 메 모리 할당해야 한다. pop과 del 에서 사용한 메모리를 반환해야 한다.
필요한 구조체 자료형
필요한 함수 리턴 타입 함수명 매개변수 기능 Liststack * createStack void 빈 스택을 생성한다. push ListStack * s, int data 새로운 원소를 스택에 추가 한다. int pop ListStack * s 스택의 최상위 자료를 꺼내 온다. del 스택의 최상위 자료를 삭제한다. peek 스택의 최상위 자료를 읽는다. freeStack 스택이 차지하고 있는 메모리를 반환한다. printStack 스택을 출력한다.
함수 가상 코드 createStack() s ← memory allocate for ListStack; if ( s = NULL) then memory full error; return NULL; else { s->top ← NULL; return s; } End createStack
함수 가상 코드 push(ListStack * s, int data) node ← memory allocate for int; if ( node = NULL) then overflow(memory full); else { node.data ← data; node.link ← s->top s->top ← node; } End push
함수 가상 코드 pop(ListStack * s) if( top = NULL) then underflow; else { temp ← s->top; data ← temp.data; s->top ← temp->link; free(temp); return data; } End pop
함수 가상 코드 del(ListStack * s) if( top = NULL) then underflow; else { temp ← s->top; data ← temp.data; s->top ← temp->link; free(temp); } End del
함수 가상 코드 peek(ListStack * s) if( top = 0) then underflow; else { data ← s->top->data; return data; } End pop
함수 가상 코드 freeStack(ListStack * s) if( top = NULL) then return; else { temp ← s->top; while( temp ≠ NULL ) then do { s->top ← s->top->link; free(temp); temp ← s->top; } } End pop
함수 가상 코드 printStack(ListStack * s) write “STACK [“; temp ← s->top; while ( temp ≠ NULL) then do { data ← temp->data; write data +” ”; temp ← temp->link; } write “] \n”; End printStack
main 소스 코드 스택을 만들고 구현한 함수들이 정상 동작하는지 를 테스트하는 코드를 작성한다. 스택에 1,2,3을 추가한 후 peek, del, pop을 사용 하여 다시 제거한다.
main 의 가상 코드 s ← createStack(); write message PrintStack(s); Push(s,1); Push(s, 2); Push(s, 3);
main 의 가상 코드 Peek(s); PrintStack(s); Del(s); Pop(s); Pop(s); freeStack(s);
Eclipse 실행 D:\Lec_hwl\CApp\y2014
Eclipse 실행
Workspace 확인 D:\Lec_hwl\CApp\y2014
CDT Perspective 확인 이 버튼을 클릭해서 수정 Java EE 로 되어 있음
CDT Perspective 확인 C/C++ 선택
CDT Perspective 확인 C/C++ 로 되어 있음
새 프로젝트 생성 File->New->C Project 반드시 C Project를 택할 것
프로젝트 명 설정 Ch06Ex02 Empty Project Cygwin GCC D:\Lec_hwl\capp\y2014\Ch06Ex02
프로젝트 구성 설정 Debug 버전과 Release 버전 모두 사용
생성된 빈 프로젝트
liststack.h 추가 및 작성 Header File 선택
liststack.h 추가 및 작성 liststack.h 헤더 파일 명 설정
liststack.h 추가 및 작성 자동 생성된 빈 헤더 파일 헤더가 여러 소스에서 포함되었을 때 이중으로 포함되지 않도록 하는 매크로 실제 헤더의 내용이 들어갈 위치
liststack.h 추가 및 작성 구조체 및 함수 원형 선언 필요한 함수들의 원형
linkedlist.c 추가 및 작성 Source File 선택
arraystack.c 추가 및 작성 Ch06Ex02 프로젝트명 확인 liststack.c 소스 파일명 설정
liststack.c 추가 및 작성 자동 생성된 빈 소스 파일
liststack.c 추가 및 작성 필요한 코드 작성(빈 함수 작성) 표준 입출력 함수 헤더 메모리할당 함수 헤더 단순연결 구조 스택 해더 필요한 각 함수의 원형에 맞게 함수의 몸체를 작성하되, 내용은 모두 빈 것으로 작성한다. 차후에 한 함수씩 코드의 내용을 작성한다.
ListStack * createStack(void)
void push(ListStack * s, int data)
int pop(ListStack * s)
int peek(ListStack * s)
void del(ListStack * s)
void freeStack(ListStack * s)
void printStack(ListStack * s)
ex0602.c 추가 및 작성 Source File 선택
ex0601.c 추가 및 작성 Ch06Ex02 프로젝트명 확인 ex0602.c 소스 파일명 설정
추가된 빈 소스 파일 프로젝트에 3 개의 파일 ex0602.c, liststack.c, liststack.h 가 추가된 것을 확인할 수 있다.
main 함수 작성 빈 main 함수 작성 표준 입출력 함수 헤더 단순연결자료구조 스택 관련 함수 헤더
main 함수 작성
main 함수 작성
main 함수 작성
빌드 및 실행 결과
도전 문제 스택에 저장하는 자료를 다음 그림과 같은 사용자 정보로 하는 단순 연결 자료구조 스택을 만들고 이 를 이용하여 사용자로부터 5개의 정보를 받아들인 후에 받아들인 역순으로 사용자 정보를 출력하는 프로그램을 작성하시오.