스택(Stack) 이란?
- 자료의 입력과 출력을 한 곳(방향)으로 제한한 자료구조
스택(Stack)의 용도
- 함수의 호출의 순서 제어(콜스택)
- 문자열 역순으로 출력
- 연산자 후위표기법
- 인터럽트가 발생하여 복귀주소를 저장할 때
- 주소지정방식 명령어의 자료 저장소
- 재귀(Recursive) 프로그램의 순서를 제어
- 컴파일러를 이용해 언어 번역
스택(Stack) 특징
- 스택은 선형구조 이다.
- LIFO(Last In First Out) 후입선출 구조이다.
- push(): 데이터 입력
- pop(): 데이터 삭제
- top(): 스택으로 할당된 기억공간에 제일 마지막에 삽입된 자료가 기억된 위치, 스택 포인터 라고도 한다.
- boottom(): 스택의 가장 밑바닥
스택(Stack)의 성질
- FILO(First In Last Out)
- 출력에 제한이 있어 Restricted Structure 라고 부르기도 한다.
- 원소의 추가가 O(1)
- 원소의 제거가 O(1)
- 제일 상단의 원소 확인이 O(1)
- 제일 상단이 아닌 나머지 원소들의 확인/변경이 원칙적으로 불가능
- 선형구조 의 자료구조이다.
스택(Stack)의 알고리즘 예시
C 언어를 이용한 Stack 구현
Java 언어를 이용한 Stack 구현
C++ 배열을 이용한 스택 구현
C++ STL Library를 사용한 Stack 구현
스택의 활용(0x08) - 수식의 괄호 쌍이란?
- 32-{6-(2+4)*7} -> { ( ) }
- 5+{6-(12+4}*7} -> { ( } )
- 수식의 괄호 쌍이란, 주어진 괄호 문자열이 올바른지 판단하는 문제 이다.
- 문자열을 앞에서부터 읽어나갈 때, 닫는 괄호는 남아있는 괄호 중에서 가장 최근에 들어온 여는 괄호와 짝을 지어 없애버리는 명령이라고 생각해도 된다.
올바르지 않은 괄호 쌍1
- ({)} -> X
- stack= ({
- ) 일때 stack top은 { 이므로 올바르지 않는다.
- ({}
- ()}
결론(올바르지 않은 괄호 문제 해결법)
- 여는 괄호가 나오면 스택에 추가
- 닫는 괄호가 나왔을 경우,
- 스택이 비어있으면 올바르지 않은 괄호 쌍
- 스택의 top이 짝이 맞지 않은 괄호일 경우 올바르지 않은 괄호 쌍
- 스택의 top이 짝이 맞는 괄호일 경우 pop
- 모든 과정을 끝낸 후 스택에 괄호가 남아있으면 올바르지 않은 괄호 쌍, 남아있지 않으면 올바른 괄호 쌍
References