-
명품 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