Stack
Queue
Deque
Q&A
Stack ์๋ฃ๊ตฌ์กฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐจ๊ณก์ฐจ๊ณก ์์ ์ฌ๋ฆฐ ํํ์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋งํ๋ค.
LIFO (Last In First Out; ํ์ ์ ์ถ): ๊ฐ์ฅ ๋ง์ง๋ง์ ์ถ๊ฐ๋ ์๋ฃ๊ฐ ๊ฐ์ฅ ๋จผ์ ์ญ์ ๋๋คtop์ ๊ฐ์ฅ ์ต๊ทผ์ ๋ค์ด์จ ์๋ฃ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ,top์ผ๋ก ์ง์ ํ ๊ณณ์ ํตํด์๋ง ๋ฐ์ดํฐ๋ฅผ ์ญ์ (pop)ํ๊ฑฐ๋ ์ถ๊ฐ(push)ํ ์ ์๋ค.- ์๋ฃ๊ตฌ์กฐ Stack์ Array, LinkedList ๋ก ๊ตฌํํ ์ ์๋ค.
์ด์์ฒด์ ์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ ์ ์ ์์ญ, ์ปค๋ ์์ญ ์ด ์๋ค.
์ ์ ์์ญ์ ํฌ๊ฒ 4๊ฐ์ง๋ก ๋๋๋๋ฐ ์ฝ๋ ์์ญ, ๋ฐ์ดํฐ ์์ญ, ํ ์์ญ, ์คํ ์์ญ ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
์คํ ์์ญ์ ์ง์ญ๋ณ์ , ๋งค๊ฐ๋ณ์ ๊ฐ ์ ์ฅ๋๋ ์์ญ์ด๋ค. ํจ์๊ฐ ์์๋๋ฉด ํด๋น ํจ์์ ์ง์ญ๋ณ์๊ฐ ์คํ ์์ญ์ ์์ด๊ณ , ํจ์๊ฐ ์ข
๋ฃ๋๋ฉด ์คํ ์์ญ์์ pop๋๋ค.
stack overflow
ํ๋์ ํจ์๊ฐ ๋๋ฌด ํฐ ์ง์ญ๋ณ์๋ฅผ ์ ์ธํ๊ฑฐ๋ ํจ์๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋ฌดํ์ ํธ์ถํ๊ฒ ๋ ๊ฒฝ์ฐ ์ด์์ฒด์ ์ ์คํ ์์ญ์ ๊ณต๊ฐ์ด ๊ฐ๋์ฐจ๊ฒ ๋ ๊ฒฝ์ฐ์ ๋ฐ์ํ๋ค.
์ปดํ์ผ๋ฌ ์ต์
์์ ์คํ ์์ญ์ ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๊ฑฐ๋, ํจ์์์ ์ฌ์ฉํ๋ ์ง์ญ๋ณ์์ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ฑฐ๋, ์ง์ญ๋ณ์๋ฅผ ์ ์ญ๋ณ์๋ฅผ ๋ฐ๊พธ์ด stack overflow ๋ฅผ ํผํ ์ ์๋ค.
stack underflow
๋น์ด์๋ ์คํ์์ ์์๋ฅผ ์ถ์ถํ๋ ค๊ณ ํ ๊ฒฝ์ฐ์ ๋ฐ์ํ๋ค.
๊ฐ๋จํ๊ฒ ์ค๋ช
ํ๋ฉด, ๋น์ด์๋ ์คํ์ pop ์ฐ์ฐ์ ์ํํ ๊ฒฝ์ฐ ๋ฐ์ํ๋ ์๋ฌ์ด๋ค.
Stack์ ๋ค์ด์จ ์์์ ๋ฐ๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ๋๋ค.
- ์น ๋ธ๋ผ์ฐ์ ์ ๋ค๋ก๊ฐ๊ธฐ ๊ธฐ๋ฅ
- ์คํ ์ทจ์ (Undo) ๊ธฐ๋ฅ
- ํ์ ํ๊ธฐ๋ฒ ๊ณ์ฐ ๊ธฐ๋ฅ
- ์์์ ๊ดํธ ๊ฒ์ฌ ๊ธฐ๋ฅ
Details
import java.util.EmptyStackException;
public class StackArray {
int top;
int size;
int[] stack;
public StackArray(int size) {
this.size = size;
stack = new int[size];
top = -1;
}
public void push(int item) {
if (top >= size) {
throw new StackOverflowError();
}
stack[top++] = item;
}
public int pop() {
if (top == 0) {
throw new EmptyStackException();
}
int data = stack[top];
stack[top--] = 0;
return data;
}
public int search(int target) {
for (int i = 0; i < top; i++) {
if (stack[i] == target) {
return i;
}
}
return -1;
}
}Details
import java.util.EmptyStackException;
public class StackLinked {
public static void main(String[] args) {
StackLinked stack = new StackLinked();
for (int i = 0; i < 10; i++) {
stack.push(i);
}
stack.display(); // 9-> 8-> 7-> 6-> 5-> 4-> 3-> 2-> 1-> 0->
System.out.println(stack.pop()); // 9
stack.display(); // 8-> 7-> 6-> 5-> 4-> 3-> 2-> 1-> 0->
}
private Node top;
public StackLinked() {
top = null;
}
public boolean isEmpty() {
return top == null;
}
public void push(int item) {
Node node = new Node(item);
node.next = top; // ์ฐ๊ฒฐ
top = node; // top์ Stack์ ๊ฐ์ฅ ์ต๊ทผ์ ๋ค์ด์จ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
}
public int pop() {
if (top == null) {
throw new EmptyStackException();
}
Node node = top;
top = top.next;
return node.item;
}
public int search(int target) {
int id = 0;
Node temp = top;
while (temp != null) {
if (temp.item == target) {
return id;
}
temp = temp.next;
id++;
}
return -1;
}
public void display() {
if (top == null) {
throw new EmptyStackException();
}
Node temp = top;
while (temp != null) {
System.out.print(temp.item + "-> ");
temp = temp.next;
}
System.out.println();
}
public class Node {
private int item;
private Node next;
public Node(int item) {
this.item = item;
next = null;
}
}
}์ ์ ์ ์ถ (FIFO) ๋ฐฉ์์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์๋ฏธํ๋ค.
FIFO (First In First Out; ์ ์ ์ ์ถ): ๋จผ์ ์ถ๊ฐ๋ ๋ฐ์ดํฐ๊ฐ ๋จผ์ ์ญ์ ๋๋ค.front๋ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ์์๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์ญ์ ์ฐ์ฐ(dequeue)์ด ์ํ๋๋คrear๋ ๊ฐ์ฅ ๋ ์์๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์ฝ์ ์ฐ์ฐ(enqueue)์ด ์ํ๋๋ค.- Queue๋ Array, LinkedList ๋ก ๊ตฌํํ ์ ์๋ค.
Queue๋ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฅ๋ ์์๋๋ก ์ฒ๋ฆฌํด์ผํ ์ํฉ์ ์ฌ์ฉ๋๋ค.
- ํ๋ก์ธ์ค ์ค์ผ์ฅด๋ง
- BFS(๋๋น ์ฐ์ ํ์) ๊ตฌํ
- LRU ์บ์ ๊ตฌํ (์ค๋ซ๋์ ์ฌ์ฉํ์ง ์๋ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ์ญ์ ํ๋ ์บ์)
Details
public class QueueArray {
int front;
int rear;
int[] queue;
public QueueArray(int size) {
queue = new int[size];
front = rear = 0;
}
public boolean isEmpty() {
return front == rear;
}
public boolean isFull() {
return rear == queue.length - 1;
}
public void enqueue(int item) {
if (isFull()) {
System.out.println("queue is full");
return;
}
queue[rear++] = item;
}
public int dequeue() {
if (isEmpty()) {
System.out.println("queue is empty");
return -1;
}
int data = queue[front];
// ๋ชจ๋ ์์๋ฅผ ํ์นธ ์์ผ๋ก ์ด๋์ํจ๋ค.
for (int i = 0; i < rear - 1; i++) {
queue[i] = queue[i + 1];
}
if (rear < queue.length) {
queue[rear] = 0;
}
rear--;
return data;
}
public void display() {
if (isFull()) {
System.out.println("queue is empty");
return;
}
for (int i = front; i < rear; i++) {
System.out.print(queue[i] + " <- ");
}
System.out.println();
}
}Details
public class QueueLinked {
public static void main(String[] args) {
QueueLinked queue = new QueueLinked();
for (int i = 0; i < 10; i++) {
queue.enqueue(i);
}
queue.display(); // 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -
for (int i = 0; i < 5; i++) {
queue.dequeue();
}
queue.display(); // 5 - 6 - 7 - 8 - 9 -
}
Node front, rear;
public QueueLinked() {
front = rear = null;
}
public boolean isEmpty() {
return front == null && rear == null;
}
public void enqueue(int item) {
Node node = new Node(item);
if (isEmpty()) {
front = rear = node;
} else {
rear.next = node;
rear = node;
}
}
public int dequeue() {
if (isEmpty()) {
System.out.println("queue is empty");
return -1;
}
int data = front.item;
front = front.next;
if (front == null) {
rear = null;
}
return data;
}
public void display() {
if (isEmpty()) {
System.out.println("queue is empty");
return;
}
Node node = front;
while (node != null) {
System.out.print(node.item + " - ");
node = node.next;
}
System.out.println();
}
public class Node {
private int item;
private Node next;
public Node(int item) {
this.item = item;
next = null;
}
}
}Details
import java.util.Stack;
public class QueueWithStack {
private Stack<Integer> s1 = new Stack<>();
private Stack<Integer> s2 = new Stack<>();
public void enqueue(int item) {
while (!s1.empty()) {
s2.push(s1.pop());
}
s1.push(item);
while (!s2.empty()) {
s1.push(s2.pop());
}
}
public int dequeue() {
if (s1.empty()){
System.out.println("queue is empty");
return -1;
}
return s1.pop();
}
}Queue ๋ ๊ฐ๋ฅผ ์ข์ฐ๋ก ๋ค์ง์์ ๋ถ์ธ ๊ตฌ์กฐ์ ํ์ฅ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
์์ชฝ ๋์์ ์ฝ์
, ์ญ์ ์ฐ์ฐ์ ๋ชจ๋ ์ํํ ์ ์๋๋ก ํ์ฅํ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
- ๋ฐ์ดํฐ์ ์ฝ์ , ์ญ์ ๊ฐ ์์ชฝ ๋์์ ์ด๋ค์ง๋ค.
- Doubly Ended Queue์ ์ฝ์์ด๋ค.
- Queue์ ๋์ผํ๊ฒ
front,rear๋ณ์๋ฅผ ์ฌ์ฉํ๋ค. - Queue์ Stack์ ์ฅ์ ๋ง ๋ฐ์ ๊ตฌ์ฑํ ๊ฒ์ด๋ค.
scroll
์ ๋ ฅ์ด ํ์ชฝ์์๋ง ์ด๋ค์ง๊ณ , ์ถ๋ ฅ์ ์์ชฝ์์ ๋ชจ๋ ์ด๋ค์ง๋ ์ ๋ ฅ์ด ์ ํ๋ Deque
shelf
์ ๋ ฅ์ ์์ชฝ์์ ๋ชจ๋ ์ด๋ค์ง๊ณ , ์ถ๋ ฅ์ด ํ์ชฝ์์๋ง ์ด๋ค์ง๋ ์ถ๋ ฅ์ด ์ ํ๋ Deque
Details
public class DequeWithArray {
public static void main(String[] args) {
DequeWithArray deque = new DequeWithArray(20);
for (int i = 1; i <= 5; i++) {
deque.insertFront(i);
}
deque.display(); // 5 4 3 2 1
for (int i = 1; i <= 5; i++) {
deque.insertRear(-i);
}
deque.display(); // 5 4 3 2 1 -1 -2 -3 -4 -5
}
private int arr[];
private int front;
private int rear;
private int size;
public DequeWithArray(int size) {
arr = new int[100];
front = -1;
rear = 0;
this.size = size;
}
public boolean isFull() {
return ((front == 0 && rear == size - 1) || front == rear + 1);
}
public boolean isEmpty() {
return front == -1;
}
public void insertFront(int item) {
if (isFull()) {
System.out.println("overflow");
return;
}
if (front == -1) {
front = rear = 0;
} else if (front == 0) {
front = size - 1;
} else {
front--;
}
arr[front] = item;
}
public void insertRear(int item) {
if (isFull()) {
System.out.println("overflow");
return;
}
if (front == -1) {
front = rear = 0;
} else if (rear == size - 1) {
rear = 0;
} else {
rear++;
}
arr[rear] = item;
}
public int deleteFront() {
if (isEmpty()) {
System.out.println("queue underflow");
return -1;
}
int data = arr[front];
if (front == rear) {
front = rear = -1;
} else if (front == size - 1) {
front = 0;
} else {
front++;
}
return data;
}
public int deleteRear() {
if (isEmpty()) {
System.out.println("queue underflow");
return -1;
}
int data = arr[rear];
if (front == -1) {
front = rear = -1;
} else if (rear == 0) {
rear = size - 1;
} else {
rear--;
}
return data;
}
public void display() {
if (isEmpty()) {
System.out.println("queue is empty");
return;
}
if (front < rear) {
for (int i = front; i <= rear; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
} else {
for (int i = front; i < size; i++) {
System.out.print(arr[i] + " ");
}
for (int i = 0; i <= rear; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
}
}



