728x90
스택이란?
- 후입선출(LIFO, Last In First Out) 자료구조
- 가장 최근에 삽입된 데이터가 가장 먼저 삭제
1. 스택의 기본 구조
스택의 기본 연산(push, pop, top, isEmpty)을 설명하는 예제
- push : 스택에 요소를 추가, 배열의 끝에 새 요소르 삽입하고, top 인덱스를 증가시킴
- pop : 스택에서 요소를 제거, 배열의 끝에서 요소를 제거하고, top 인덱스를 감소
- peek : 스택의 최상위 요소를 확인, 스택의 top 인덱스에 있는 요소를 반환
- isEmpty : 스택이 비어 있는지 확인, top 인덱스가 -1이면 스택이 비어있는 것
스택 구현
#include <iostream>
#define MAX 1000 // 스택의 최대 크기
using namespace std;
class Stack
{
int top;
int capacity; // 스택의 크기
public:
int a[MAX]; // 스택 배열
Stack()
{
top = -1; // 스택 초기화
capacity = 0; // 스택의 크기 초기화
}
bool push(int x);
int pop();
int peek();
bool isEmpty();
int size(); // 스택의 크기를 반환하는 함수
};
// 스택에 요소를 추가하는 함수
bool Stack::push(int x)
{
if(top >= (MAX - 1))
{
cout<< "스택 오버플로우\n";
return false;
}
else
{
a[++top] = x;
capacity++;
cout<<x<<" 스택에 푸쉬 되었습니다\n";
return true;
}
}
// 스택에서 요소를 제거하는 함수
int Stack::pop()
{
if(top < 0)
{
cout<< "스택 언더플로우\n";
return 0;
}
else
{
int x = a[top--];
capacity--;
return x;
}
}
// 스택에 최상위 요소를 반환하는 함수
int Stack::peek()
{
if(top < 0)
{
cout<<"스택에 쌓인게 없어요\n";
return 0;
}
else
{
int x = a[top];
return x;
}
}
// 스택이 비었는지 확인하는 함수
bool Stack::isEmpty()
{
return (top<0);
}
// 스택의 크기를 반환하는 함수
int Stack::size()
{
return capacity;
}
int main()
{
Stack s;
s.push(10);
s.push(20);
s.push(30);
cout<<s.pop()<<"\n";
cout<<s.peek()<<"\n";
cout<<s.size()<<"\n";
cout<<s.isEmpty()<<"\n";
return 0;
}
과제로 하면 좋을 것
스택의 크기 반환 함수를 추가해보자- 스택을 동적 배열로 구현해보자
- 연결 리스트를 이용한 스택을 구현해보자
- 예외 처리를 추가하여 더 견고한 스택 클래스를 만들어보자
필요에 따라 STL의 std::stack을 사용하는 것도 좋은 방법
스택을 동적 배열로 구현
#include <iostream>
#include <vector>
using namespace std;
class Stack {
private:
vector<int> a; // 동적 배열을 이용한 스택
public:
Stack() {}
bool push(int x);
int pop();
int peek();
bool isEmpty();
int size(); // 스택의 크기를 반환하는 함수
};
// 스택에 요소를 추가하는 함수
bool Stack::push(int x) {
a.push_back(x);
cout << x << " 스택에 푸쉬 되었습니다\n";
return true;
}
// 스택에서 요소를 제거하는 함수
int Stack::pop() {
if (a.empty()) {
cout << "스택 언더플로우\n";
return 0;
} else {
int x = a.back();
a.pop_back();
return x;
}
}
// 스택의 최상위 요소를 반환하는 함수
int Stack::peek() {
if (a.empty()) {
cout << "스택에 쌓인게 없어요\n";
return 0;
} else {
return a.back();
}
}
// 스택이 비었는지 확인하는 함수
bool Stack::isEmpty() {
return a.empty();
}
// 스택의 크기를 반환하는 함수
int Stack::size() {
return a.size();
}
int main() {
Stack s;
s.push(10);
s.push(20);
s.push(30);
cout << s.pop() << " 스택에서 팝 되었습니다\n";
cout << "최상위 요소는 " << s.peek() << " 입니다\n";
cout << "스택의 크기는 " << s.size() << " 입니다\n";
cout << "스택이 비었나요? " << (s.isEmpty() ? "네" : "아니요") << endl;
return 0;
}
728x90
'전산 > 자료구조' 카테고리의 다른 글
자료구조 - 자료구조, 데이터 구조 (1) | 2024.07.05 |
---|---|
자료구조 - 01 자료구조와 알고리즘 (0) | 2024.04.29 |