[1] 스택이란?

스택
은 쌓는다라는 의미로 먼저 들어온 데이터가 마지막에 제일 나중에 들어온 데이터가 처음으로 꺼낼 수 있는 구조를 말합니다. 이를 LIFO(Last In First Out) 구조라고 합니다.
✏️ Note
스택을 삽입하는 연산을 PUSH, 스택에 있는 데이터를 꺼내는 행위를 POP이라고 부릅니다.
[2] 스택의 ADT(Abstract Data Type)
ADT
는 구현하는 구조(Stack)에 대해서 구현 방법을 명시하지 않고 어떠한 데이터의 구조와 연산들을 하는지에 대한 설명(명세)을 말합니다. 스택의 연산에는 push
, pop
, isFull
, isEmpty
, top과
같은 연산들이 존재합니다. 아래의 설명을 보도록 하겠습니다.
- push()
push
는 스택에 데이터를 넣는 연산을 수행합니다. - pop()
pop
은 가장 최근에 스택에push 한
데이터를 꺼내어, 데이터를 반환합니다. - isFull()
isFull
은 스택에 데이터가 더 들어갈 공간이 있는지 확인합니다. 공간이 없다면True
를 반환 있다면False
를 반환합니다. - isEmpty()
isEmpty
는 스택의 공간에 데이터가 하나 이상이라도 있는지를 확인하는 것이며, 있다면False
, 없다면True
를 반환합니다. - top()
top
은 가장 최근에push 한
데이터를 확인합니다. - size()
size
는 스택의 최대 크기를 확인할 수 있습니다.
[3] 스택 사용해 보기 - C++
#include <iostream>
#include <stack>
using namespace std;
int main() {
stack<int> st;
// push 연산
st.push(1);
st.push(2);
st.push(3);
// 스택이 isEmpty에 대해서 True를 반환할 때까지 pop 수행
while(!st.empty()) {
cout << st.top() << " "; // 가장 최근에 넣은 데이터 출력
st.pop(); // // 데이터를 pop 수행
}
}
[4] 괄호 짝 맞추기 문제
(1) 설명
괄호 문자열은 두 개의 괄호 기호인 (
, )
만으로 구성되어 있는 문자열입니다. (
문자열을 스택에 넣어두고, ) 문자열이
있을 때에 스택에 (
가 있는지 확인 후 없다면 NO를 출력하거나 있다면 (
을 pop을 수행하고 다음 문자열을 검사합니다. N의 길이만큼 스택을 이용해서 시간제한은 점근 표기법 O(n)에 됩니다.
(2) 코드
#include <iostream>
#include <stack>
using namespace std;
bool solution (string brakets) {
stack<char> st;
for (int i = 0; i < brakets.length(); i++) {
if (brakets[i] == '(') {
st.push('(');
} else {
if (st.empty()) return false;
st.pop();
}
}
// 스택이 비어있다면 모든 괄호가 닫힌 것으로 확인한다.
if (st.empty()) return true;
// 스택이 비어있지 않다면 모든 괄호가 닫히지 않은 것으로 확인한다
return false;
}
int main() {
int n;
cin >> n;
string brakets;
for (int i = 0; i < n; i++) {
cin >> brakets;
bool isBraket = solution(brakets);
if (isBraket) cout << "YES" << endl;
else cout << "NO" << endl;
}
}
✏️ Note
stack의 push와 pop은 시간복잡도가 O(1)입니다.
[4] 참고문헌
- 박경록, 코딩 테스트 합격자 되기 C++편
- 박경록 저자님의 스터디에 참가하여 정리하며 작성한 글입니다.
'알고리즘 > 이론' 카테고리의 다른 글
배열 - C++ ( 문제 포함 ) (0) | 2024.05.30 |
---|---|
시간복잡도 (알고리즘 문제 활용) (0) | 2024.05.24 |
[1] 스택이란?

스택
은 쌓는다라는 의미로 먼저 들어온 데이터가 마지막에 제일 나중에 들어온 데이터가 처음으로 꺼낼 수 있는 구조를 말합니다. 이를 LIFO(Last In First Out) 구조라고 합니다.
✏️ Note
스택을 삽입하는 연산을 PUSH, 스택에 있는 데이터를 꺼내는 행위를 POP이라고 부릅니다.
[2] 스택의 ADT(Abstract Data Type)
ADT
는 구현하는 구조(Stack)에 대해서 구현 방법을 명시하지 않고 어떠한 데이터의 구조와 연산들을 하는지에 대한 설명(명세)을 말합니다. 스택의 연산에는 push
, pop
, isFull
, isEmpty
, top과
같은 연산들이 존재합니다. 아래의 설명을 보도록 하겠습니다.
- push()
push
는 스택에 데이터를 넣는 연산을 수행합니다. - pop()
pop
은 가장 최근에 스택에push 한
데이터를 꺼내어, 데이터를 반환합니다. - isFull()
isFull
은 스택에 데이터가 더 들어갈 공간이 있는지 확인합니다. 공간이 없다면True
를 반환 있다면False
를 반환합니다. - isEmpty()
isEmpty
는 스택의 공간에 데이터가 하나 이상이라도 있는지를 확인하는 것이며, 있다면False
, 없다면True
를 반환합니다. - top()
top
은 가장 최근에push 한
데이터를 확인합니다. - size()
size
는 스택의 최대 크기를 확인할 수 있습니다.
[3] 스택 사용해 보기 - C++
#include <iostream>
#include <stack>
using namespace std;
int main() {
stack<int> st;
// push 연산
st.push(1);
st.push(2);
st.push(3);
// 스택이 isEmpty에 대해서 True를 반환할 때까지 pop 수행
while(!st.empty()) {
cout << st.top() << " "; // 가장 최근에 넣은 데이터 출력
st.pop(); // // 데이터를 pop 수행
}
}
[4] 괄호 짝 맞추기 문제
(1) 설명
괄호 문자열은 두 개의 괄호 기호인 (
, )
만으로 구성되어 있는 문자열입니다. (
문자열을 스택에 넣어두고, ) 문자열이
있을 때에 스택에 (
가 있는지 확인 후 없다면 NO를 출력하거나 있다면 (
을 pop을 수행하고 다음 문자열을 검사합니다. N의 길이만큼 스택을 이용해서 시간제한은 점근 표기법 O(n)에 됩니다.
(2) 코드
#include <iostream>
#include <stack>
using namespace std;
bool solution (string brakets) {
stack<char> st;
for (int i = 0; i < brakets.length(); i++) {
if (brakets[i] == '(') {
st.push('(');
} else {
if (st.empty()) return false;
st.pop();
}
}
// 스택이 비어있다면 모든 괄호가 닫힌 것으로 확인한다.
if (st.empty()) return true;
// 스택이 비어있지 않다면 모든 괄호가 닫히지 않은 것으로 확인한다
return false;
}
int main() {
int n;
cin >> n;
string brakets;
for (int i = 0; i < n; i++) {
cin >> brakets;
bool isBraket = solution(brakets);
if (isBraket) cout << "YES" << endl;
else cout << "NO" << endl;
}
}
✏️ Note
stack의 push와 pop은 시간복잡도가 O(1)입니다.
[4] 참고문헌
- 박경록, 코딩 테스트 합격자 되기 C++편
- 박경록 저자님의 스터디에 참가하여 정리하며 작성한 글입니다.
'알고리즘 > 이론' 카테고리의 다른 글
배열 - C++ ( 문제 포함 ) (0) | 2024.05.30 |
---|---|
시간복잡도 (알고리즘 문제 활용) (0) | 2024.05.24 |