자료구조란 데이터를 효율적으로 이용할 수 있도록 저장하는 방법이며, 이를 통해 효율적인 알고리즘을 구현할 수 있다.
자료구조는 선형구조와 비선형구조로 구분된다.
1. Stack
스택은 선형구조 중 하나로, 삭제과 삽입이 한 곳에서 이루어지는 구조를 말한다. 이름처럼 데이터가 쌓여가는 구조이기때문에 가장 나중에 삽입된 값이 가장 먼저 삭제된다.(Last in Fist Out: LIFO)
data삽입 순서 [data1, data2, data3, data4, data5]
data 삭제 순서 [data5, data4, data3, data2, data1]

1.1 ADT(Abstract Data Type)

1.2 Python 구현
# class로 구현
class Stack:
    def __init__(self):
        stack = [] # create()
    def is_empty(self):
        if not len(self.stack):
            return True
        return False
    
    def push(self, item):
        self.stack.append(item) 
    def pop(self):
        if not self.is_empty():
            return self.stack.pop()python 리스트 특성상 is_full은 구현할 필요가 없다.
1.3 Stack 예제
1918번

스택으로 풀 수 있는 문제 중 대표적인 것이 중위 표기식을 후위 표기식으로 바꾸는 문제이다.
# 리스트 특성 활용
op_order = {"-": 1, "+": 1, "*": 2, "/": 2, "(": 0}
ex = input()
stack = []
for c in ex:
    if c in op_order.keys():
        if not stack or c == '(':
            stack.append(c)
        else:
            while stack and op_order[c] <= op_order[stack[-1]]:
                print(stack.pop(), end='')
            stack.append(c)
    
    elif c == ')':
        while stack and stack[-1] != '(':
            print(stack.pop(), end='')
        if stack and stack[-1] == '(':
            stack.pop()
    else:
        print(c, end='')     
while stack:
    print(stack.pop(), end='')
1874번

# 리스트 특성 활용
import sys  
write = sys.stdout.write # print()보다 빠름
read = sys.stdin.readline # input()보다 빠름
n = int(input())
stack = []
input_list = []
result = []
for _ in range(n):
    val = int(read())
    input_list.append(val)
u = True
index = 0
i = 1
while index < len(input_list):
    if i > input_list[index]:
        if stack[-1] == input_list[index]:
            stack.pop()
            result.append("-")
            index += 1
        else:
            u = False
            break
    else:
        stack.append(i)
        result.append("+")
        i += 1
if u:
    for s in result:
        write(s+"\n")
else:
    print("NO")