โ๏ธ Stack ํด๋์ค
- List ์ปฌ๋ ์ ํด๋์ค์ Vector ํด๋์ค๋ฅผ ์์๋ฐ์, ์ ํ์ ์ธ ์คํ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ํด๋์ค๋ฅผ ์ ๊ณต
์คํ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ ์ ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฉด์ ํ์ ์ ์ถ(LIFO)์ ์๋ฉํฑ์ ๋ฐ๋ฅด๋ ์๋ฃ ๊ตฌ์กฐ์ด๋ค.
์ฆ, ๊ฐ์ฅ ๋์ค์ ์ ์ฅ๋(push) ๋ฐ์ดํฐ๊ฐ ๊ฐ์ฅ ๋จผ์ ์ธ์ถ(pop)๋๋ ๊ตฌ์กฐ์ด๋ค.
Stack์ ์ข ๋ ์์๋ณด์.
โ๏ธ Stack
: LIFO(Last In First Out)๊ตฌ์กฐ. ๋ง์ง๋ง์ ์ ์ฅ๋ ๊ฒ์ ์ ์ผ ๋จผ์ ๊บผ๋ด๊ฒ ๋๋ค.
์์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด์ ์์๊ฐ ํ๋ ์๋ค๊ณ ์๊ฐํด๋ณด์.
์ฌ๊ธฐ์ 0์ด๋ผ๋ ๋ฌผ๊ฑด์ ๋จผ์ ๋ฃ๊ณ 1์ ๋ฃ๊ณ 2์ ๋ฃ์๋ค. ๋จผ์ ๋ฃ์๊ฒ ๋ฐ๋ฅ์ ๊น๋ฆฌ๊ณ ๊ทธ ๋ค์ ์ฐจ๊ณก์ฐจ๊ณก ์์ฌ์ง ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๊บผ๋ผ๋๋ ๋ง์ง๋ง์ ๋ฃ์๋ ๋ฌผ๊ฑด 2๋ถํฐ ๊บผ๋ด๊ฒ ๋๋ค.
โ๏ธ ์ ์ฅ(push)
: 0 โก๏ธ 1 โก๏ธ 2
โ๏ธ ์ถ์ถ(pop)
: 2 โก๏ธ 1 โก๏ธ 0
Stack๊ณผ Queue๋ ์ปดํจํฐ์์ ๊ฐ์ฅ๋ง์ด ํ์ฉ๋๋ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ์ด๋ค.
์ฌ๋ฌ๊ณณ์์ ํ์ฉ๋๊ฐ ์ ค ๋์ ๊ฒ์ด Stack์ด๋ค.
โ๏ธ boolean empty()
- Stack์ด ๋น์ด์๋์ง ์๋ ค์ค๋ค.
โ๏ธ Object peek()
- Stack์ ๋งจ ์์ ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. (๋งจ ์์ ๋ญ๊ฐ ์๋์ง ๋ณด๋ ๊ฒ)
- pop()๊ณผ ๋ฌ๋ฆฌ Stack์์ ๊ฐ์ฒด๋ฅผ ๊บผ๋ด์ง๋ ์๋๋ค.
- ๋น์์ ๋๋
EmptyStackException
๋ฐ์
โ๏ธ Object pop()
- ์ญ์
- Stack์ ๋งจ ์์ ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ๊บผ๋ธ๋ค.
- ๋น์์ ๋๋
EmptyStackException
๋ฐ์
โ๏ธ Object push(Object item)
- ์ถ๊ฐ
- Stack์ ๊ฐ์ฒด(item)๋ฅผ ์ ์ฅํ๋ค.
โ๏ธ int search(Object o)
- Stack์์ ์ฃผ์ด์ง ๊ฐ์ฒด(o)๋ฅผ ์ฐพ์์ ๊ทธ ์์น๋ฅผ ๋ฐํํ๋ค.
- ๋ชป์ฐพ์ผ๋ฉด -1์ ๋ฐํํ๋ค.
- ๋ฐฐ์ด๊ณผ ๋ฌ๋ฆฌ ์์น๋ 0์ด ์๋ 1๋ถํฐ ์์ํ๋ค.
โ๏ธ Queue ์ธํฐํ์ด์ค
- ํด๋์ค๋ก ๊ตฌํ๋ ์คํ๊ณผ๋ ๋ฌ๋ฆฌ ์๋ฐ์์ ํ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ ๋ณ๋์ ์ธํฐํ์ด์ค ํํ๋ก ์ ๊ณต๋๋ค.
์ด๋ฌํ Queue ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๋ ํ์ ์ธํฐํ์ด์ค๋ ๋ค์๊ณผ ๊ฐ๋ค.
- Deque<E>
- BlockingDeque<E>
- BlockingQueue<E>
- TransferQueue<E>
์ด ์ค์์ Deque
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ LinkedList ํด๋์ค๊ฐ ํ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ๋ ๋ฐ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ค.
Queue๋ ์ธํฐํ์ด์ค์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด ์์ฑ์ ํ ์ ์๋ค.
๋ฐ๋ผ์ Queue ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ class๋ค์ ํ์ฉํด์ผ ํ๋ค.
์ด์ค์ ์ฐ๋ฆฌ์๊ฒ ์ต์ํ LinkedList
๊ฐ ์๋ค. ์ด class๋ฅผ ์จ์ Queue์ ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์๋ค.
Queue q = new LickedList();
g.offer("0");
Queue์ ๋ํด์ ์ข ๋ ์์ธํ ์์๋ณด์.
โ๏ธ Queue
: FIFO(First In First Out)๊ตฌ์กฐ. ์ ์ผ ๋จผ์ ์ ์ฅํ ๊ฒ์ ์ ์ผ ๋จผ์ ๊บผ๋ด๊ฒ ๋๋ค.
์์ ์ฌ์ง์ ๋ณด๋ฏ์ด ์ด๊ฒ์ ์ค์๊ธฐ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
๊ณ์ฐ๋์ ์ค์ ์ค๋ ๋จผ์ ์ ์ฌ๋์ด ๋จผ์ ํ๋ฏ์ด ์ด ๊ตฌ์กฐ๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
์ ์ฅํ ๋๋ 0, 1, 2 ์์ผ๋ก ์ ์ฅํ๋ค๋ฉด ๊บผ๋ผ๋๋ 0, 1, 2 ์์ผ๋ก ๊บผ๋ด์ง๋ค.
โ๏ธ ์ ์ฅ(offer)
: 0 โก๏ธ 1 โก๏ธ 2
โ๏ธ ์ถ์ถ(poll)
: 0 โก๏ธ 1 โก๏ธ 2
โ๏ธ boolean add(object o)
- ์ถ๊ฐ
- ์ง์ ๋ ๊ฐ์ฒด๋ฅผ Queue์ ์ถ๊ฐํ๋ค.
- ์ฑ๊ณตํ๋ฉด true๋ฅผ ๋ฐํํ๋ค.
- ์ ์ฅ๊ณต๊ฐ์ด ๋ถ์กฑํ๋ฉด
IllegalStateException
๋ฐ์
โ๏ธ Object remove()
- ์ญ์
- Queue์์ ๊ฐ์ฒด๋ฅผ ๊บผ๋ด ๋ฐํํ๋ค.
- ๋น์ด์์ผ๋ฉด
NoSuchElementException
๋ฐ์
โ๏ธ Object element()
- ์ญ์ ์์ด ์์๋ฅผ ์ฝ์ด์จ๋ค.
- peek์ ๋ฌ๋ฆฌ Queue๊ฐ ๋น์์ ๋
NoSuchElementException
๋ฐ์
โ๏ธ boolean offer(Object o) โญ๏ธ
- ์ถ๊ฐ
- Queue์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ค.
- ์ฑ๊ณตํ๋ฉด true, ์คํจํ๋ฉด false๋ฅผ ๋ฐํํ๋ค. (์์ธ๋ฐ์ X)
โ๏ธ Object poll() โญ๏ธ
- ์ญ์
- Queue์์ ๊ฐ์ฒด๋ฅผ ๊บผ๋ด์ ๋ฐํํ๋ค.
- ๋น์ด์์ผ๋ฉด null์ ๋ฐํํ๋ค. (์์ธ๋ฐ์ X)
โ๏ธ Object peek() โญ๏ธ
- ์ญ์ ์์ด ์์๋ฅผ ์ฝ์ด์จ๋ค.
- Queue๊ฐ ๋น์ด์์ผ๋ฉด null์ ๋ฐํํ๋ค.
โ๏ธ Stack: ๋ฐฐ์ด
โ๏ธ Queue: LinkedList
โ๏ธ ์์
public class StackAndQueue {
public static void main(String[] args) {
Stack st = new Stack();
Queue q = new LinkedList(); // Queue์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์ธ LinkedList
st.push("0");
st.push("1");
st.push("2");
q.offer("0");
q.offer("1");
q.offer("2");
System.out.println("==Stack==");
while(!st.empty()) {
System.out.println(st.pop()); // ์คํ์์ ์์๋ฅผ ํ๋ํ๋ ๊บผ๋
}
System.out.println("==Queue==");
while(!q.isEmpty()) {
System.out.println(q.poll()); // ํ์์ ์์๋ฅผ ํ๋ํ๋ ๊บผ๋
}
}
}
==Stack==
2
1
0
==Queue==
0
1
2
- ์์๊ณ์ฐ
- ์์๊ดํธ๊ฒ์ฌ
- ์๋ํ๋ก์ธ์์ undo / redo
- ์น๋ธ๋ผ์ฐ์ ์ ๋ค๋ก / ์์ผ๋ก
- ์ต๊ทผ ์ฌ์ฉ ๋ฌธ์
- ์ธ์์์ ๋๊ธฐ๋ชฉ๋ก
- ๋ฒํผ(buffer): ์์ ์ด ์์
import java.util.*;
public class StackTest {
public static void main(String[] args) {
Stack st = new Stack();
Scanner sc = new Scanner(System.in);
System.out.println("์์์ ์ ์ผ์์ค: ");
String expression = sc.next();
System.out.println("expression" + expression);
try {
for(int i = 0; i < expression.length(); i++) {
char ch = expression.charAt(i);
if(ch == '(') {
st.push(ch + "");
} else if (ch == ')') {
st.pop();
}
}
if(st.isEmpty()) {
System.out.println("๊ดํธ๊ฐ ์ผ์นํฉ๋๋ค.");
} else {
System.out.println("๊ดํธ๊ฐ ์ผ์นํ์ง ์์ต๋๋ค.");
}
} catch (EmptyStackException e) {
System.out.println("๊ดํธ๊ฐ ์ผ์นํ์ง ์์ต๋๋ค. Exception");
}
}
}
import java.util.*;
public class QueueTest {
static Queue q = new LinkedList();
static final int MAX_SIZE = 5;
public static void save(String input) {
// Queue์ ์ ์ฅํ๋ค.
if(!"".equals(input)) { // if(input == null && !input.equals(""))
q.offer(input);
}
// Queue์ ์ต๋ํฌ๊ธฐ๋ฅผ ๋์ผ๋ฉด ์ ์ผ ์ฒ์ ์
๋ ฅ๋ ๊ฒ์ ์ญ์ ํ๋ค.
if(q.size() > MAX_SIZE) {
q.remove();
}
}
public static void main(String[] args) {
System.out.println("help๋ฅผ ์
๋ ฅํ๋ฉด ๋์๋ง์ ๋ณผ ์ ์์ต๋๋ค.");
// ๋ฌดํ๋ฐ๋ณต์ ์ผ์ผ์ผ์ ์
๋ ฅ์ ์ํด
while(true) {
System.out.println(">>");
try{
Scanner sc = new Scanner(System.in);
String input = sc.nextLine().trim(); // ์๋ค ๊ณต๋ฐฑ ์์ฐ
if("".equals(input)) {
continue; // ์์ ๋น ์ ธ๋์์ ๋ฐ๋ณต๋ฌธ while๋ถํฐ ๋ค์ ์์
}
if(input.equalsIgnoreCase("q")) {
System.exit(0);
} else if(input.equalsIgnoreCase("help")) {
save(input);
System.out.println("help - ๋์๋ง์ ๋ณด์ฌ์ค๋๋ค.");
System.out.println("q ๋๋ Q - ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํฉ๋๋ค.");
System.out.println(
"history - ์ต๊ทผ์ ์
๋ ฅํ ๋ช
๋ น์ด๋ฅผ " + MAX_SIZE + "๊ฐ๋ฅผ ๋ณด์ฌ์ค๋๋ค."
);
} else if (input.equalsIgnoreCase("history")) {
// ์
๋ ฅ๋ฐ์ ๋ช
๋ น์ด ์ ์ฅ
save(input);
// LinkedList์ ๋ด์ฉ์ ๋ณด์ฌ์ค๋ค.
LinkedList list = (LinkedList) q;
//list.size๋ ๋ฐ๋์ง ์์ผ๋ฏ๋ก ์์๋ก ๋๋ค. (๋ฐ๋ณตํ์๊ฐ ๋ง์ ์๋ก ์ด๋ ๊ฒ ๋ฌ์ผ ํ๋ค.)
final int SIZE = list.size();
for(int i = 0; i < SIZE; i++)
System.out.println((i + 1) + ". " + list.get(i));
} else {
save(input);
System.out.println(input);
}
} catch (Exception e) {
System.out.println("์
๋ ฅ์ค๋ฅ์
๋๋ค.");
}
} // while end
}
}
help๋ฅผ ์
๋ ฅํ๋ฉด ๋์๋ง์ ๋ณผ ์ ์์ต๋๋ค.
>>
help
help - ๋์๋ง์ ๋ณด์ฌ์ค๋๋ค.
q ๋๋ Q - ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํฉ๋๋ค.
history - ์ต๊ทผ์ ์
๋ ฅํ ๋ช
๋ น์ด๋ฅผ 5๊ฐ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
>>
history
1. help
2. history
>>
hello
hello
>>
hi
hi
>>
oh!
oh!
>>
history
1. history
2. hello
3. hi
4. oh!
5. history
>>
q
References
: https://cafe.naver.com/javachobostudy