먼저 저번에 올렸던 스택 게시물에서 작성한 스택 class를 간단히 작성해보았습니다.
스택
class Stack(object):
def __init__(self):
self.head = None
self.size = 0
def push(self, value):
self.head = Node(value, self.head)
self.size += 1
def pop(self):
if self.head is None:
print("Stack is Empty!")
else:
node = self.head
self.head = self.head.pointer
self.size -= 1
return node.value
# 스택이 비었다면 True, 아니면 False
def isEmpty(self):
if self.size == 0 and self.head is None:
return True
else:
return False
문자열을 거꾸로 출력한다면 많은 방법이 있겠지만 그 중에 스택을 활용해보겠습니다.
스택은 LIFO(후입선출)형태이므로 입력된 문자열을 순서대로 스택에 push한 다음
순서대로 pop을 한다면 간단하게 문자열을 거꾸로 출력이 가능합니다.
문자열 : 파이썬은 쉽고 재밌습니다.
출력 : .다니습밌재 고쉽 은썬이파
스택을 이용해서 문자열 거꾸로 출력
def reversed_string(str1):
s = Stack()
reverse = ''
for i in str1: # 스택에 순서대로 push
s.push(i)
for _ in range(s.size):
reverse += s.pop() # 스택의 값들을 pop해서 새로운 문자열에 추가
return reverse
if __name__ == "__main__":
str1 = "파이썬은 쉽고 재밌습니다."
print(str1)
print(reversed_string(str1)) # .다니습밌재 고쉽 은썬이파
문자 전체가 아니라 단어 단위로 뒤집으려면 단어 단위로 스택에 push, pop하면 간단히 작성할 수 있습니다.
예를 들어
문자열 : "파이썬 알고리즘은 너무 재밌습니다."
출력 : "재밌습니다." "너무" "알고리즘은" "파이썬"
단어단위로 거꾸로 출력
def reversed_words(str1):
s = Stack()
for w in str1.split(" "):
s.push(w)
#while not s.isEmpty():
while s.head:
print(s.pop(), end = " ")
print()
if __name__ == "__main__":
str1 = "파이썬 알고리즘은 너무 재밌습니다."
reversed_words(str1) # 재밌습니다. 너무 알고리즘은 파이썬
문자열을 하나씩 확인해서 만약 '('이라면 스택에 push해줄거고 ')'라면 pop을 해줄겁니다.
스택을 사용하는 이유는 '(())'같이 괄호 끼리의 순서를 판별하기 위해서입니다.
안쪽 괄호가 먼저 닫혀야 정상 괄호가 되기 때문입니다.
더 응용해서 소괄호, 중괄호, 대괄호를 같이 생각해볼 수도 있습니다.
스택을 이용하여 괄호 판별
def balance(str1):
s = Stack()
isBalance = True # 괄호의 정상 유무를 표시할 변수
index = 0
# 문자열의 길이만큼 반복 and isBalance가 True동안 반복
while index < len(str1) and isBalance:
symbol = str1[index]
if symbol == '(':
s.push(symbol)
elif symbol == ')':
if s.isEmpty(): # 스택이 비어있는데 ')'가 나온다면
isBalance = False
else:
s.pop()
index += 1
# 스택이 비어있다면 괄호의 수 정상(True), 그게 아니라면 비정상(False)
return isBalance and s.isEmpty()
if __name__ == "__main__":
str1 = '(())()()'
str2 = '()((())()'
print(balance(str1)) # True
print(balance(str2)) # False
10진수의 수를 2로 나눈 나머지를 스택에 push하고, 몫이 0이 될때까지 push를 반복합니다.
마지막으로 스택에 저장된 값들을 pop을 한다면, 2진수로 출력이 가능합니다.
2진수 뿐만 아니라 매개변수n을 다른 값으로 활용하여 n진수로 변환하여 출력이 가능합니다.
스택을 이용하여 10진수를 n진수로 변환
def toBinary(num, i): # 2진수로 바꾸려면 i=2가 된다.
s = Stack()
temp = num
result = ''
# 2로 나눈 나머지를 스택에 push 반복
while temp != 0:
s.push(temp % i)
temp = temp // i
# 스택에서 차례대로 pop하여 결과값에 문자열 형식으로 더해준다.
while s.head:
result += str(s.pop())
print()
return result
if __name__ == "__main__":
result = toBinary(321, 2)
print(result) # 101000001
이상으로 스택을 활용해서 몇몇 응용을 해보았습니다.
[Python] 정렬 / 삽입 정렬(Insertion sort) (0) | 2021.11.24 |
---|---|
[Python] 정렬 / 버블 정렬(Bubble sort) / 선택 정렬(Selection sort) (0) | 2021.11.24 |
[Python] 단일 연결 리스트 / 끝에서 k번째 찾기 / 연결 리스트 분할 (0) | 2021.11.19 |
[Python] 단일 연결 리스트(LinkedList) (0) | 2021.11.19 |
[Python] 우선순위 큐(Priority Queue)와 힙(Heap) (0) | 2021.11.18 |