연결 리스트(Linked List)란 선형 배열과 비슷하지만 차이가 있다.
선형 배열이 "번호가 붙여진 칸에 원소들을 채워넣는" 방식이라고 한다면, 연결 리스트는 "각 원소들을 줄줄이 엮어서" 관리하는 방식
def insertAt(self, pos, newNode):
if pos < 1 or pos > self.nodeCount + 1:
return False
if pos == 1:
newNode.next = self.head
self.head = newNode
else:
if pos == self.nodeCount + 1:
prev = self.tail
else:
prev = self.getAt(pos - 1)
newNode.next = prev.next
prev.next = newNode
if pos == self.nodeCount + 1:
self.tail = newNode
self.nodeCount += 1
return True
pos가 가리키는 위치에 newNode를 삽입 True/False 리턴(pos 값의 범위: 1 <= pos <= nowCount +1)
def concat(self, L):
self.tail.next = L.head.next
if L.tail:
self.tail = L.tail
self.nodeCount += L.nodeCount
양방향 연결 리스트 (Doubly Linked Lists)란, 연결 리스트에서는 먼저 오는 데이터 원소를 담은 노드로부터 그 뒤에 오는 데이터 원소를 담은 노드를 향하는 방향으로만 연결되어 있었다. 양방향 연결 리스트에서는 노드들이 앞/뒤로 연결되어 있습니다.
스택 (Stacks)이란, 추가된 데이터 원소들을 끄집어내면 마지막에 넣었던 것부터 넣은 순서의 역순으로 꺼내지는 자료 구조.
후입선출 (LIFO: last-in first-out) 자료 구조
size()
: 현재 스택에 들어 있는 데이터 원소의 수를 구함
isEmpty()
: 현재 스택이 비어 있는지를 판단 (size() == 0?
)
push(x)
: 데이터 원소 x 를 스택에 추가
pop()
: 스택에 가장 나중에 저장된 데이터 원소를 제거 (또한, 반환)
peek()
: 스택에 가장 나중에 저장된 데이터 원소를 참조 (반환), 그러나 제거하지는 않음
사용하는 이유: 후위 표기법을 이용하면, 괄호를 쓰지 않고도 연산의 우선순위를 수식에 표현할 수 있다.
예를 들어 (A + B) * (C + D)
를 후위 표기법으로 변환하여 쓰면
-> A B + C D + *
연산과정
숫자를 저장하는 스택: number_stack[ ]
A B + C D + *
1. A,B,C,D 같은 숫자를 만나면 스택에 숫자를 저장한다.
2. +-/*
와 같은 연산기호를 만나면 숫자 스택에서 두개 씩 꺼낸다. 이때 스택의 성질에 따라 뒤에서 두개의 숫자가 나온다.
3. 두 숫자를 연산 기호에 맞게 연산한뒤 결과 값을 다시 스택에 저장한다.