본문 바로가기

프로그래밍/CS 이론

Example using Stack in Python

1. Stack 클래스 정의

from queue import Empty

class ArrayStack:

    def __init__(self):
        self._data = []
    
    def __len__(self):
        return len(self._data)

    def is_empty(self):
        return len(self._data) == 0

    def push(self, e):
        self._data.append(e)

    def pop(self):
        if self.is_empty():
            raise Empty('Stack is empty')
        return self._data.pop()

    def top(self):
        if self.is_empty():
            raise Empty('Stack is empty')
        return self._data[-1]

2. 소 · · 대괄호로 묶인 표현식의 검증

def is_matched(expr):
    lefty = "({["
    righty = ")}]"
    S = ArrayStack()

    for c in expr:
        if c in lefty:
            S.push(c)
        elif c in righty:
            if S.is_empty():
                return False
            if righty.index(c) != lefty.index(S.pop()):
                return False
    return S.is_empty()

3. html 스크립트 검증

def is_matched_html(raw):
    S = ArrayStack()
    j = raw.find("<")
    while j != -1:
        k = raw.find(">", j+1)
        tag = raw[j+1:k]
        if k == -1:
            return False
        if not tag.startswith("/"):
            S.push(tag)
        else:
            if S.is_empty():
                return False
            if tag[1:] != S.pop():
                return False
        j = raw.find("<", k+1)
    return S.is_empty()

1. "<"를 찾음

2. ">"를 찾음

3. 사이의 문자열을 스택에 저장

4. 2.에서 찾은 ">" 뒤의 "</"를 찾음

5. 있으면 뒤의 문자열을 스택.pop()과 비교, 없으면 1.로 돌아감


4. 임의의 종목이 며칠만의 상한가인지를 기록한 list를 반환

def cal_span(X):
    A = ArrayStack()
    S = [0 for _ in range(len(X))]
    for i in range(len(X)):
        while (not A.is_empty()) and (X[A.top()] <= X[i]):
            A.pop()
        if A.is_empty():
            S[i] = i + 1
        else:
            S[i] = i - A.top()
            print(str(i) + " - " + str(A.top()))
        A.push(i)
        print(A._data)
    return S

1. A라는 스택에 현재 관찰중인 시기의 인덱스 i를 저장

2. 종목의 주가[i]와 주가[i+1]을 비교

3. 후자가 더 크면 A.pop()하며 더 과거의 주가와 비교

4. 전자가 커질 때까지 비교

5. 전자가 커진 만큼의 기간을 리스트 S에 저장

'프로그래밍 > CS 이론' 카테고리의 다른 글

메서드 vs 클래스  (1) 2024.07.24
Circular Queue in Python  (0) 2022.03.29