어제 학원에서 스택을 배웠다.
스택이란 자료구조가 따로 있는 게 아니고, 배열이나 링크드리스트로 스택처럼 구현하는 거다.
- 스택은 Last In First Out
- 나중에 들어간게 먼저 나오는 애인데,
- 예를 들자면 초밥집 접시 쌓을 때 순차적으로 쌓쥬? 마지막으로 쌓은 접시를 가장 먼저 빼는 그 개념
- 배열은 할당된 메모리에 데이터를 저장하기 때문에 어디에 저장할지 기억하는 변수가 필요함 (Top = 0)
- 왜냐? 몇 번째 방에 저장할 지를 알아야 하니까
- 배열의 최대 크기== TOP의 크기라면 그게 오버플로우임
#include <iostream>
using namespace std;
class Stack {
public:
// 집어 넣는 함수
void Push(int num)
{
ary[top++] = num;
}
// 빼는 함수
void Pop()
{
// 오버플로우 안되게 top이 0보다 클 때만 top을 1씩 줄인다
if(top > 0)
top--;
}
// top 크기만큼 배열 출력
void Print()
{
for (int i = 0; i < top; i++)
{
cout << ary[i] << endl;
}
}
private:
int top = 0; // 몇번째 저장할 차례인지 알려주는 꼭대기!
int ary[10]; // 방 10개 짜리 배열
int length = 10; // 배열의 길이
};
int main()
{
Stack stack1; // stack1이라는 객체 생성
stack1.Push(2); // 2를 푸쉬해서 배열 0번방에 2 넣어줌
stack1.Push(30); // 30푸쉬해서 배열 1번방에 30 넣어줌
stack1.Pop(); // 팝(빼줘서)해서 top크기가 0이 되었다
stack1.Print(); // 출력하면!!! 배열0번 방 값만 나오게 됨!
return 0;
}
위 내용을 초밥 구조체 배열로 적용해서 수정해보면 아래와 같다.
#include <iostream>
using namespace std;
struct SushiSt{
string name = "초밥이름";
int price = 1004;
};
class Sushi {
enum{ MAX_ARRAY_SIZE = 10 };
public:
Sushi()
: m_top(0)
{
}
void Push(string name, int price)
{
m_sushiAry[m_top].name = name;
m_sushiAry[m_top++].price = price;
}
void Pop()
{
if (m_top > 0)
m_top--;
}
void Print()
{
for (int i = 0; i < m_top; i++)
{
cout << i+1 << ". " << m_sushiAry[i].name << " " << m_sushiAry[i].price << endl;
}
}
private:
SushiSt m_sushiAry[MAX_ARRAY_SIZE]; // 초기화 안 해서 맨첨에 쓰레기값 들어가있음
int m_top;
};
int main()
{
Sushi sushi1;
sushi1.Push("계란", 1500);
sushi1.Push("연어", 2000);
sushi1.Push("참치", 3000);
sushi1.Pop();
sushi1.Print();
return 0;
}
'자료구조' 카테고리의 다른 글
[자료구조] DFS와 BFS (0) | 2024.08.02 |
---|---|
[자료구조] Double Linked List (C++) (1) | 2023.10.23 |
[자료구조] Single Linked List (C++) (0) | 2023.10.15 |
[자료구조] Stack 구현 (C++) (3) | 2023.03.19 |