파이썬으로 알아보는 자료구조 - stack

Stack

  • 자료의 입력과 출력이 한 쪽 끝으로 제한됨
  • 나중에 들어간 데이터가 먼저 나옴(LIFO - Last In First Out)
  • 후입선출

image

예시

  • 프로세스의 메모리 구조의 스택 영역

용어

  • push : 데이터를 스택에 넣음
  • pop : 데이터를 스택에서 꺼냄
  • top : 데이터의 입출력이 일어나는 끝 부분

장단점

장점

  • 구조가 단순하다

단점

  • 데이터의 최대 개수를 설정해야한다.
  • 메모리의 낭비가 발생할 수 있다(최대 개수만큼 저장 공간을 확보해야하기 때문).

연습

1. 파이썬의 리스트를 통해 스택 맛보기

리스트의 append 함수와 pop 함수를 사용하면 손쉽게 스택을 구현할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
s_list = []

# push
s_list.append(1)
s_list.append(2)
s_list.append(3)

print(s_list) # [1, 2, 3]

# pop
s_list.pop() # 3
s_list.pop() # 2

2. push / pop 함수 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
s_list = []

def push(data):
s_list.append(data)

def pop():
_res = s_list[-1]
del s_list[-1]
return _res

for i in range(10):
push(i)

pop()
pop()
pop()

3. 클래스를 이용한 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class CustomStack():
def __init__(self):
self.s_list = []

def push(self, data):
self.s_list.append(data)

def pop(self):
_res = self.s_list[-1]
del self.s_list[-1]
return _res

st = CustomStack()
for i in range(10):
st.push(i)

st.pop()
Share

파이썬으로 알아보는 자료구조 - queue

스택(Stack)과 더불어 가장 기초가 되는 자료구조이다.

Queue

  • 매표소에서 한 줄로 서서 기다리는 것과 같다
  • 먼저 들어간 데이터가 먼저 나옴(FIFO - First In First Out)
  • 즉, 선입선출

image

예시

  • 운영체제(OS)에서 프로세스 스케쥴링을 구현하는데에 사용

용어

  • enqueue - 큐에 데이터를 삽입(insert)
  • dequeue - 큐에서 데이터를 꺼냄(delete)

연습

1. 파이썬의 리스트를 이용해 enqueue, dequeue 구현

1
2
3
4
5
6
7
8
9
q_list = []

def enqueue(data):
q_list.append(data)

def dequeue():
res = q_list[0]
del q_list[0]
return res

2. 파이썬의 클래스 이용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class CustomQueue():
def __init__(self):
self.q_list = []

def enqueue(self, data):
self.q_list.append(data)

def dequeue(self):
_res = self.q_list[0]
del self.q_list[0]
return _res

def pprint(self):
for data in self.q_list:
print(data)

if __name__ == '__main__':
q = CustomQueue()
for i in range(10):
q.enqueue(i)

q.pprint()

for _ in range(5):
q.dequeue()

q.pprint()
Share

[파이썬]for 반복문의 다앙한 사용법

파이썬의 for 반복문은 매우 유용하다. for문에서 쓰일 수 있는 패턴을 간단히 정리한다.

1. 기본적인 for 반복문

in 뒤에는 iterable한 객체(순회 가능한 객체)가 올 수 있다.

1
2
3
4
5
6
7
8
9
10
11
num_list = [1, 2, 3, 4, 5]

for num in num_list:
print(num)

# 결과
# 1
# 2
# 3
# 4
# 5

2. continue

for 반복문을 수행중 continue를 만나면 다음 반복으로 넘어간다. 즉, continue 아래에 코드가 있더라도 작동하지 않고 다음 순회로 넘어간다.

아래의 코드는 홀수인 숫자만 출력하는 예시이다.

1
2
3
4
5
6
7
8
9
10
11
12
num_list = [1, 2, 3, 4, 5]

for num in num_list:
# num가 짝수라면 아래의 print를 호출하지 않고 다음 반복 차례로 넘어간다
if num % 2 == 0:
continue
print(num)

# 출력
# 1
# 3
# 5

3. break

반복을 중지한다. 즉, break를 만나면 해당 반복문을 더 이상 순회하지 않는다. 여기서 주의해야할 점으로는 중첩 반복문일 경우 모든 반복문을 중지하는 것이 아닌 break를 포함하는 반복문 하나만 영향을 받는다.

아래의 코드는 num이 3일때 반복을 중지한다.

1
2
3
4
5
6
7
8
9
10
num_list = [1, 2, 3, 4, 5]

for num in num_list:
if num == 3:
break
print(num)

# 결과
# 1
# 2

4. for…else 구문

if조건문 처럼 else 구문을 사용할 수 있다. for 반복문을 문제없이 완료하게 되면 else 구문을 수행한다. 다시말해 break를 만나 도중에 반복이 중지되는 경우 else 구문을 호출되지 않는다. 자주 사용되지는 않으며 for 반복문이 문제없이 제대로 사용되었는지 확인하는 용도로 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
num_list = [1, 2, 3, 4, 5]

for num in num_list:
print(num)
else:
print('num_list의 모든 원소를 문제없이 출력했습니다')

# 결과
# 1
# 2
# 3
# 4
# 5
# num_list의 모든 원소를 문제없이 출력했습니다
Share