본문 바로가기

Programming/ C++

(C++) 큐, 스택이 뭔지 아시나요?? FIFO? FILO?

728x90
반응형



큐, 스택구조를 프로그래밍 해보았습니다.


큐, 스택이란???


큐(Queue) : FIFO(First In First Out)

   ▷ 먼저 들어간 데이터가 먼저 빠져나오는 구조입니다.



스택(Stack) : LIFO(Last In First Out) 

   ▷ 마지막에 들어간 데이터가 먼저 빠져나오는 구조입니다.


(메모리 클래스)

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
class Memory {
protected:
    int *mem;
    int i;
 
public:
    Memory() {
        mem = new int[20];
        i = -1;
    }
    virtual ~Memory() {
        delete[] mem;
    }
    virtual void pop() = 0;
 
    void push() {    
        if (i < 19) {
            i++;
            cout << "메모리에 넣을 수를 입력해 주세요 : ";
            cin >> mem[i];
            
            
        }
        else {
            cout << "더이상 넣을 수 없습니다!\n";
        }
    }
};
cs

 메모리 클래스입니다. mem 의 크기를 동적할당 해줍니다,

그리고 순수가상함수 pop을 자식에게 사용하도록 합니다.

push함수에선 메모리에 데이터를 넣는 작업을 만들도록 하였습니다.


(스택 클래스)

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
class MyStack : public Memory {
    int j;
public:
    void pop() {
        if (i >= 0) {
            cout << "\n값을 뺐습니다 : ";
            cout << mem[i] << endl;
            cout << "\n";
            i--;
        }
        else {
            cout << "\n더이상 뺄 수 없습니다!\n";
        }
    }
    void disp() {
        if (i == -1) {
            cout << "\n아무런 값도 없습니다!\n\n";
        }
        for (j = 0; j < i + 1; j++) {
            if (mem[j] != NULL) {
                cout << mem[j] << endl;
 
            }
            else
                break;
        }
    }
};
cs

 스택 클래스입니다.  스택의 구조에 따라 마지막에 들어간 데이터가

먼저 나오도록 만들었습니다. pop함수가 사용한 i는 Memory클래스에서 커져서 들어오기때문에 mem[i]는 가장 마지막에 들어온 데이터가 됩니다.


(큐 클래스)

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
class MyQueue : public Memory {
 
public:
    int j;
    virtual void pop() {
        if (i >= 0) {
            cout << "\n값을 뺐습니다 : ";
            cout << mem[0]<< endl;
            cout << "\n";
            for (j = 0; j < i; j++) {
                    mem[j] = mem[j + 1];
            }
            i--;
        }
        else {
            cout << "\n더이상 뺄 수 없습니다!\n\n";
        }
    }
    void disp() {
        if (i == -1) {
            cout << "\n아무런 값도 없습니다!\n\n";
        }
 
        for (j = 0; j < i + 1; j++) {
            if (mem[j] != NULL) {
                    cout << mem[j] << endl;
                }
                else
                    break;
            
        }
    }
};
cs

큐 클래스입니다.  큐의 구조에 따라 처음에 들어간 데이터가

먼저 나오도록 만들었습니다. pop함수에서의 mem[0]은 가장 처음에 들어온 데이터가 됩니다. 또한 mem[ j ] = mem[ j + 1 ]에서 데이터들을 반복문을 사용해 한칸씩 당겨오도록 만들었습니다.


(메뉴 클래스 및 메인)

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
68
69
70
71
class Menu {
    MyStack ms;
    MyQueue mq;
public:
    Memory *p;
    void menu() {
        int sel=0;
        
        while (sel != 3) {    
        int sel1 = 0;
        cout << "          ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n";
        cout << "          ┃   ◆큐 스택 메뉴입니다◆  ┃\n";
        cout << "          ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n";
        cout << "   ┏━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━┓\n";
        cout << "   ┃   1. Queue  ┃   2. Stack  ┃   3. Exit   ┃\n";
        cout << "   ┗━━━━━━━━━━━━━┻━━━━━━━━━━━━━┻━━━━━━━━━━━━━┛\n";
        cout << " ▶무엇을 하시겠습니까? >> ";
        cin >> sel;    
            switch (sel) {
            case 1: system("cls");
                p = &mq;
                while (sel1 != 4) {
 
                    cout << "                 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n";
                    cout << "                 ┃     ◆ 큐 메뉴입니다◆    ┃\n";
                    cout << "                 ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n";
                    cout << "   ┏━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━┓\n";
                    cout << "   ┃   1. Push   ┃    2. Pop   ┃   3. Disp   ┃   4. Priv   ┃\n";
                    cout << "   ┗━━━━━━━━━━━━━┻━━━━━━━━━━━━━┻━━━━━━━━━━━━━┻━━━━━━━━━━━━━┛\n";
                    cout << " ▶무엇을 하시겠습니까? >> ";
                    cin >> sel1;
                    switch (sel1) {
                    case 1: system("cls"); p->push();   break;
                    case 2: system("cls"); p->pop(); break;
                    case 3: system("cls"); mq.disp(); break;
                    case 4: system("cls"); cout << "\n이전메뉴로 돌아갑니다.\n" << endlbreak;
                    default: system("cls");  cout << "\n잘못된 입력입니다\n" << endl;
                    }
                }
                break;
            case 2: system("cls");
                p = &ms;
                while (sel1 != 4) {
                    cout << "                 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n";
                    cout << "                 ┃    ◆ 스택 메뉴입니다◆   ┃\n";
                    cout << "                 ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n";
                    cout << "   ┏━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━┓\n";
                    cout << "   ┃   1. Push   ┃    2. Pop   ┃   3. Disp   ┃   4. Priv   ┃\n";
                    cout << "   ┗━━━━━━━━━━━━━┻━━━━━━━━━━━━━┻━━━━━━━━━━━━━┻━━━━━━━━━━━━━┛\n";
                    cout << " ▶무엇을 하시겠습니까? >> ";
                    cin >> sel1;
                    switch (sel1) {
                    case 1: system("cls"); p->push();   break;
                    case 2: system("cls"); p->pop(); break;
                    case 3: system("cls"); ms.disp(); break;
                    case 4: system("cls"); cout << "\n이전메뉴로 돌아갑니다.\n" << endlbreak;
                    default: system("cls");  cout << "\n잘못된 입력입니다\n" << endl;
                    }
                }break;
            case 3cout << "\n프로그램을 종료합니다.\n" << endlbreak;
            default: system("cls");  cout << "\n잘못된 입력입니다\n" << endl;
            }
        }
    }
};
 
void main() {
    Menu m;
 
    m.menu();
}
cs

메뉴클래스입니다 메뉴에서 선택지들을 선택할 수 있게 하였습니다.


QS.exe

실행파일입니다.

반응형