반응형

5.6> 문제 5번의 MyIntStack를 수정하여 다음과 같이 선언하였다. 스택에 저장할 수 있는 정수의 최대 개수는 생성자에서 주어지고 size 멤버에 유지한다. MyIntStack 클래스를 작성하라.


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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <iostream>
 
using namespace std;
 
class MyIntStack{
private:
    int *p; //스택 메모리로 사용할 포인터
    int size//스택의 최대 크기
    int tos; //스택의 탑을 가리키는 인덱스
public:
    MyIntStack();
    MyIntStack(int size);
    MyIntStack(MyIntStack& s);
    ~MyIntStack();
    bool push(int n); //정수 n을 스택에 푸쉬 꽉차있으면 false 아니면 true
    bool pop(int &n);  //스택의 탑에 있는 값을 n에 pop 한다 스택이 비었으면 false 아니면 true
};
MyIntStack::MyIntStack(){size=1;    p=new int[size];    tos=-1;} //기본 생성자 정의 tos=-1은 empty state를 나타낸다.
MyIntStack::MyIntStack(int size){this->size=size;    p=new int[size];    tos=-1;} //인자 size가 동적 배열의 크기를 결정한다.
//tos=-1이 empty 를 뜻하는 이유는 배열의 인덱스가 0부터 시작하기 때문이다.
MyIntStack::MyIntStack(MyIntStack& s){this->size=s.size
    p=new int[s.size]; //깊은 복사를 위해 새로운 동적메모리를 힙에서 size만큼 받아온다.
    for(int i=0;i<s.size;i++){
    (this->p)[i]=(s.p)[i];
    } //포인터에 할당된 동적메모리의 경우 깊은 복사를 위해
//새로운 할당을 해준 후 배열의 원소를 일일히 복사하여 넣어준다.
this->tos=s.tos;}
MyIntStack::~MyIntStack(){
    if(this->p) //p에 주소값이 NULL이 아니면
        delete []p; //p가 가리키는 동적메모리 반환
}
bool MyIntStack::push(int n){
    if((tos+1)==size//index는0부터 시작해서 1을 더해서 검사함
        return false;
    else{
        p[++tos]=n; //증가시키고 대입해준다.
        return true;
    }
}
bool MyIntStack::pop(int &n){
    if(tos==-1//empty면
        return false;
    else{
        n=p[tos--]; //대입하고 감소시킨다.
        return true;
    }
}
int main(void){
    MyIntStack a(10); //size 10짜리 마이인트스택 a
    a.push(10); //a에 10 삽입 pos=0
    a.push(20);//a에 20 삽입 pos=1
    MyIntStack b=a; //MyIntStack b(a); 와 같다.
    //객체로 초기화 하여 객체 생성,복사생성자 실행됨(깊은복사)
    b.push(30); //b에 30 삽입 pos=2
    int n;
    a.pop(n); //20 pop, pos=0이됨
    cout<<"스택 a에서 팝한 값 "<<n<<endl;
    b.pop(n); //30 pop, pos=1이됨
    cout<<"스택 b에서 팝한 값 "<<n<<endl;
    b.pop(n); //20 pop, pos=0이됨
    cout<<"스택 b에서 팝한 값 "<<n<<endl;
    b.pop(n); //10 pop, pos=-1이됨
    cout<<"스택 b에서 팝한 값 "<<n<<endl;
    cout<<b.pop(n)<<endl//pos=-1, empty state 라서 0 리턴
    return 0;
}
 
cs




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C++' 카테고리의 다른 글

Book 클래스  (1) 2017.11.09
Accumulator 클래스  (0) 2017.11.09
포인터의 증감  (0) 2017.11.09
변수와 포인터와 참조  (0) 2017.11.08
float와 double  (0) 2017.11.05

+ Recent posts