ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 명품 C++ 8장 5번 6번
    C++ 2018. 11. 4. 18:28

    문제 5~6에 적용되는 BaseArray 클래스는 다음과 같다.


    class BaseArray {
    private:
        int capacity; // 배열의 크기
        int *mem; // 정수 배열을 만들기 위한 메모리의 포인터
    protected:
        BaseArray(int capacity = 100) {
            this->capacity = capacity; mem = new int[capacity];
        }
        ~BaseArray() { delete[] mem; }
        void put(int index, int val) { mem[index] = val; }
        int get(int index) { return mem[index]; }
        int getCapacit() { return capacity; }
    };


    5. BaseArray를 상속받아 큐처럼 작동하는 MyQueue 클래스를 작성하라.


    소스코드


    #include <iostream>
    using namespace std;
    class BaseArray {
    private:
        int capacity; // 배열의 크기
        int *mem; // 정수 배열을 만들기 위한 메모리의 포인터
    protected:
        BaseArray(int capacity = 100) {
            this->capacity = capacity; mem = new int[capacity];
        }
        ~BaseArray() { delete[] mem; }
        void put(int index, int val) { mem[index] = val; }
        int get(int index) { return mem[index]; }
        int getCapacity() { return capacity; }
    };
    class MyQueue : protected BaseArray { // 원형 큐 사용
        int front; // 첫 번째 요소로부터 시계 방향으로 하나 앞
        int rear; // 마지막 요소
    public:
        MyQueue(int capacity) : BaseArray(capacity) { front = rear = 0; }
        void enqueue(int n) { // 큐에 삽입
            rear = (rear + 1) % getCapacity();
            put(rear, n);
        }
        int dequeue() { // 큐에 있는 데이터를 꺼냄
            front = (front + 1) % getCapacity();
            return get(front);
        }
        int capacity() { return getCapacity(); } // 배열의 크기 리턴
        int length() { return (rear - front) % getCapacity(); } // 큐의 길이 리턴
    };
    int main() {
        MyQueue mQ(100);
        int n;
        cout << "큐에 삽입할 5개의 정수를 입력하라>> ";
        for (int i = 0; i < 5; ++i) {
            cin >> n;
            mQ.enqueue(n); // 큐에 삽입
        }
        cout << "큐의 용량:" << mQ.capacity() << ", 큐의 크기:" << mQ.length() << endl;
        cout << "큐의 원소를 순서대로 제거하여 출력한다>> ";
        while (mQ.length() != 0) {
            cout << mQ.dequeue() << ' '; // 큐에서 제거하여 출력
        }
        cout << endl << "큐의 현재크기 : " << mQ.length() << endl;
    }


    실행결과



    객체를 생성할 때, 크기와 함께 생성되는데, BaseArray를 상속받았기 때문에 BaseArray 생성자로 매개변수(크기)를 넘겨주어야합니다.

    원형 큐를 사용하여 MyQueue 클래스를 작성했습니다. private 멤버들은 파생클래스에서 접근 할 수 없으므로 함수를 이용해 리턴했습니다. 

    BaseArray 멤버함수들이 protected여서 상속도 protected 로 했습니다.


    6. BaseArray 클래스를 상속받아 스택으로 작동하는 MyStack 클래스를 작성하라


    소스코드


    #include <iostream>
    using namespace std;
    class BaseArray {
    private:
        int capacity; // 배열의 크기
        int *mem; // 정수 배열을 만들기 위한 메모리의 포인터
    protected:
        BaseArray(int capacity = 100) {
            this->capacity = capacity; mem = new int[capacity];
        }
        ~BaseArray() { delete[] mem; }
        void put(int index, int val) { mem[index] = val; }
        int get(int index) { return mem[index]; }
        int getCapacity() { return capacity; }
    };
    class MyStact : protected BaseArray {
        int tos;
    public:
        MyStact(int capacity) : BaseArray(capacity) { tos = 0; }
        void push(int n) {
            put(tos, n);
            ++tos;
        }
        int pop() {
            --tos;
            return get(tos);
        }
        int capacity() { return getCapacity(); }
        int length() { return tos; }
    };
    int main() {
        MyStact mStack(100);
        int n;
        cout << "스택에 삽입할 5개의 정수를 입력하라>> ";
        for (int i = 0; i < 5; ++i) {
            cin >> n;
            mStack.push(n); // 스택에 푸시
        }
        cout << "스택 용량:" << mStack.capacity() << ", 스택 크기:" << mStack.length() << endl;
        cout << "스택의 원소를 순서대로 제거하여 출력한다>> ";
        while (mStack.length() != 0) {
            cout << mStack.pop() << ' '; // 스택에서 팝
        }
        cout << endl << "스택의 현재크기 : " << mStack.length() << endl;
    }


    실행결과



    원래 스택은 tos를 -1 로 시작하지만, 이 프로그램의 경우 pop에서 리턴을 하고 tos 을 감소하게 할 수 없기때문에 tos 가 0부터 시작했습니다. 

    큐와 스택의 개념말고는 5번과 비슷합니다.


    'C++' 카테고리의 다른 글

    명품 C++ 8장 8번  (0) 2018.11.04
    명품 C++ 8장 7번  (0) 2018.11.04
    명품 C++ 8장 3번 4번  (0) 2018.11.04
    명품 C++ 8장 1번 2번  (0) 2018.11.04
    명품 C++ 7장 Open Challenge  (0) 2018.11.03

    댓글

© 2018 TISTORY. All rights reserved.