A. Stack은 후입선출 LIFO(Last In First Out)의 자료구조. 시간복잡도는 push O(1) , pop O(1). 활용 예시는 후위 표기법 연산, 괄호 유효성 검사, 웹 브라우저 방문기록(뒤로 가기), 깊이우선탐색(DFS) 등
A. queue의 enqueue()를 구현할 때 첫 번째 stack을 사용하고, dequeue()를 구현할 때 두 번째 stack을 사용하면 queue를 구현.
편의상 enqueue()에 사용할 stack을 instack이라고 부르고 dequeue()에 사용할 stack을 outstack.
enqueue() :: instack에 push()를 하여 데이터를 저장합니다.
dequeue() ::
import java.util.Stack;
class Queue<T> {
private Stack<T> instack;
private Stack<T> outstack;
public Queue() {
instack = new Stack<>();
outstack = new Stack<>();
}
public void enqueue(T element) {
instack.push(element);
}
public T dequeue() {
if (outstack.isEmpty()) {
while (!instack.isEmpty()) {
outstack.push(instack.pop());
}
}
return outstack.pop();
}
public static void main(String[] args) {
Queue<Integer> queue = new Queue<>();
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
System.out.println(queue.dequeue()); // Output: 1
System.out.println(queue.dequeue()); // Output: 2
System.out.println(queue.dequeue()); // Output: 3
}
}
```
편의상 push()에 사용할 queue는 q1이라고 부르고 pop()에 사용할 queue를 q2.
push() :: q1으로 enqueue()를 하여 데이터를 저장합니다.
pop() ::
import java.util.LinkedList;
import java.util.Queue;
class Stack<T> {
private Queue<T> q1;
private Queue<T> q2;
public Stack() {
q1 = new LinkedList<>();
q2 = new LinkedList<>();
}
public void push(T element) {
q1.offer(element);
}
public T pop() {
while (q1.size() > 1) {
q2.offer(q1.poll());
}
Queue<T> temp = q1;
q1 = q2;
q2 = temp;
return q2.poll();
}
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println(stack.pop()); // Output: 3
System.out.println(stack.pop()); // Output: 2
System.out.println(stack.pop()); // Output: 1
}
}
```
Queue 자료구조는 시간 순서상 먼저 집어 넣은 데이터가 먼저 나오는 선입선출 FIFO(First In First Out) 구조로 저장하는 형식. 이와 다르게 우선순위큐(priority queue)는 들어간 순서에 상관없이 우선순위가 높은 데이터가 먼저 나옵니다.
Queue의 operation 시간복잡도는 enqueue O(1), dequeue O(1)이고,
Priority queue는 push O(logn) , pop O(logn) 입니다
출처 : 인프런 - 기출로 대비하는 개발자 전공면접 [CS 완전정복]