1. 스택의 프로그램 구현1-1. 프로그램 소소코드/설명#include #include class Stack{private:enum {MAX = 3}; // 최대 크기가 MAX인(4) 공백스택을 생성int items[MAX]; // 스택 메모리 설정int top; // 스택 포인트public:Stack();bool Isempty();bool Isfull();bool push(int);bool pop(int);void printState();};Stack::Stack(){top = 0;}bool Stack::Isempty() // 스택 내에 데이터의 수가 없는 경우{return top == 0;}bool Stack::Isfull() // 스택 내에 데이터의 수가 스택의 최대크기와 같은 경우{return top == MAX;}bool Stack::push(int item){if(top < MAX) // 스택이 (오버플로우)꽉찼는지지 체크{items[top++] = item; // 스택 내에 데이터값 삽입return true;}elsereturn false;}bool Stack::pop(int item){if(top > 0) // 스택 (언더플로우)데이터값이없는지 체크{item = items[--top]; // 스택 내에 데이터값을 삭제하고 반환return true;}elsereturn false;}void Stack::printState() // 현재 스택 내의 데이터값을 출력{for(int i=top-1; i>=0; i--){if(i == top-1)cout < "t" < items[i] < "t 프로그램을 종료" < endl < endl ;cout < "실행할 번호를 입력하세요 : ";while(cin >> n && n != 4){switch(n){case 1:cout < endl < "삽입할 데이터값을 입력 : ";cin >> item;if(st.Isfull())cout < "(오버플로우)꽉 차서 저장할 장소가 없습니다." ;elsest.push(item);break;case 2:if(st.Isempty())cout < "(언더플로우)삭제고자할 아무 것도 없습니다." ;elsest.pop(item);break;case 3:if(st.Isempty())cout < "출력할 데이터값이 없음.";elsest.printState();break;case 4:cout < "프로그램을 종료합니다" < endl;break;}if(n != 4){system("cls");cout < endl < "1번 -> 스택에 데이터값을 추가하기" < endl ;cout < "2번 -> 스택에서 데이터값을 제거하기" < endl;cout < "3번 -> 현재의 스택상태를 출력" < endl;cout < "4번 -> 프로그램을 종료" < endl < endl ;cout < "실행할 번호를 입력하세요 : ";}}}1-2. 스택의 이론/설명(1) 스택의 정의"스택"이란 여러 개의 데이타 항목들이 일정한 순서로 나열된 자료 구조로, 한쪽 끝에서만 새로운 항목을 삽입하거나 기존 항목을 삭제할 수 있도록 고안된 것이다.(2) 스택의 원리스택은 동전을 넣고 뺄 수 있도록 되어 있는 동전 케이스와 같은 작동 원리를 가지고 있다. 삽입된 동전들은 케이스 내부에 일정한 순서로 저장된다. 먼저 삽입된 동전은 케이스의 가장 아래쪽에 위치하고 가장 최근에 삽입된 동전은 입구에 놓인다. 주차장에 주차한 자동차도 마찬가지이다. 월드컵 경기를 보러 일찍 승용차를 타고 온 사람이 있다고 하자. 주차장의 안쪽 깊숙한 곳에 주차를 마쳤다. 경기가 끝나고 가려고 보니 나중에 들어온 차들 때문에 나갈 수가 없었다. 결국 나중에 들어온 차들이 모두 나갈 때까지 기다린 후에 집에 돌아갈 수 있었다.(3) 스택의 성질스택에 저장된 데이타 항목들 중에 먼저 삽입된 것은 나중에 삭제되고, 나중에 삽입된 것이 먼저 삭제된다. 그래서 스택을 후입 선출 리스트(Last- In-First-Out List)라고 부른다. 선입 선출법(FIFO)을 사용하는 큐와는 상반된 성질을 가진다.스택의 LIFO구조는 '하노이의 탑' 문제를 통해 쉽게 이해할 수 있다.64개의 원판을 모두 2칸 떨어진 막대기로 옮기되, 원판은 한 번에 한 개씩 옮겨야 하고, 절대로 작은 원판 위에 큰 원판을 올려 놓을 수 없다는 것이 하노이의 탑 문제의 규칙이다. 위 사이트에 가면 자바애플릿으로 실습을 해볼 수 있다. 실습을 통해 나중에 들어온 것이 먼저 나가게 되는 스택의 LIFO구조를 확실히 이해할 수 있을 것이다.{Stack Pointer Top(4){{{{{Stack Base{DataItems{{스택의 구조{i10{Stack Limit스택은 기저(base)로부터 데이타 항목들을 차례로 쌓아올린 모양을 가진다.삽입과 삭제는 현재 저장된 최상위 항목이 위치한 top 에서만 일어난다.top 위치는 "스택 포인터"라는 지시자가 가리킨다.스택 포인터는 스택 기저에서 시작하여 항목이 삽입되면 하나 증가하고, 삭제되면 하나 감소한다.스택에는 한계가 있어서 그 한계를 초과하도록 삽입할 수 없다.(5) 스택의 동작 용어설명push()데이타 항목을 삽입하려면 스택 포인터를 하나만큼 증가시켜 주고 스택의 top 에 데이타 항목을 저장한다. 데이타 항목을 삽입하기 전에 새로운 항목을 저장할 빈 공간이 있는지 검사해야 한다.else top = top + 1stack(top) ← 삽입pop()데이타 항목을 삭제하려면 스택의 top 에 있는 데이타 항목을 제거하고 스택 포인터를 하나만큼 감소시켜 준다. 데이타 항목을 삭제하기 전에 스택이 비어있는지를 검사해야 한다.
1-4 이진탐색의 O(g(n))함수f(n)=c(g(n))f(n)=n+2 c(g(n))=2n c=2 g(n)=O(n)그러므로O(n)=n+2이다.1-5 결론이진탐색은 많은 수 중에서 우리가 찾고자하는 수를 찾을 때 유용하게 쓰인다. 이것을 이용하면 많은 수가 있을지라도 짧은 시간에 필요한 자료를 쉽게 찾을수 있다. 이진탐색의 그래프는 거의 일정한 값으로 증하는 그래프이다.
1-5 결론피보니치 수열은 Fn-1과 Fn-2를 합하여 Fn을 구하는 구조로서 재귀함수를 사용한다. 재귀함수를 이용해서 함수값을 리턴받아서 값을 찾아내는 것이다.피보니치의 수열의 값은 무한정 커진다.큰 숫자를 넣으면 언젠가는 값이 나오겠지만 그 값을 찾는데는 무수히 많은 시간이 소모된다. 40을 넣었을때보다 50을 넣었을때는 엄청나가 시간이 오래걸립니다.
1-5 결론조물주가 사원의 승려에게 명하기를, "64개의 원판을 하나씩 옮겨서 다른 다른 기둥 위에 원래 상태대록 옮겨 놓되, 옮기는 과정에서 절대로 큰 원판이 작은 원판 위에 놓이지 않도록 하여라. 모든 원판이 옮겨지면 세상은 종말이 올 것이며, 충실한 자는 상을 받을 것이고 불충실한 자는 벌을 받을 것이다"라고 하였답니다.그정도로 오래걸린다는건데,이 하노이 탑에서 n개의 돌이 있다고 가정하면 n개의 돌을 옮기는데 -1번 만큼 움직여야 돌을 옮길수 있다.