이 글은 유튜브 '자바의 정석 - 기초편'을 보고 정리한 글입니다.
📂content
1. Stack과 Queue의 활용
⚝ 스택의 활용 예
수식계산, 수식괄호검사, 워드프로세서의 undo/redo, 웹브라우저의 뒤로/앞으로
⚝ 큐의 활용 예
최근사용문서, 인쇄작업 대기목록, 버퍼 (buffer)
⍟실습1
Stack
더보기
package etc;
import java.util.EmptyStackException;
import java.util.Stack;
public class Ex11_3 {
public static void main(String[] args) {
// if(args.length != 1){
// System.out.println("Usage:java Ex11_3 \"EXPRESSION\"");
// System.out.println("Example:java Ex11_3 \"((2+3)*1)+3\"");
// System.exit(0);
// }
Stack st = new Stack();
String expression = "((3+5)*8-2)";//args[0];
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("괄호가 일치하지 않습니다.");
} //try
}
}
⍟실습2
Queue
더보기
package etc;
import java.util.LinkedList;
import java.util.ListIterator;
import java.util.Queue;
import java.util.Scanner;
public class Ex11_4 {
static Queue q = new LinkedList();
//최근 5개의 명령어 이력
static final int MAX_SIZE = 5; // Queue에 최대 5개까지만 저장되도록 한다.
public static void main(String[] args) {
System.out.println("help를 입력하면 도움말을 볼 수 있습니다.");
while(true) {
System.out.print(">>");
try {
// 화면으로부터 라인단위로 입력받는다.
Scanner s = new Scanner(System.in);
String input = s.nextLine().trim();
if("".equals(input)) continue; //아래를 통과함
if(input.equalsIgnoreCase("q")) {
System.exit(0);
} else if(input.equalsIgnoreCase("help")) {
//equalsIgnoreCase : 대소문자 구분X
System.out.println(" help - 도움말을 보여줍니다.");
System.out.println(" q 또는 Q - 프로그램을 종료합니다.");
System.out.println(" history - 최근에 입력한 명령어를 "
+ MAX_SIZE +"개 보여줍니다.");
} else if(input.equalsIgnoreCase("history")) {
int i=0;
// 입력받은 명령어를 저장하고,
save(input);
// LinkedList의 내용을 보여준다.
LinkedList tmp = (LinkedList)q;
ListIterator it = tmp.listIterator();
//final int SIZE = list.size();
//for(int i=0; i<SIZE; i++){
// System.out.println((i+1)+"."+list.get(i));
//}
while(it.hasNext())
System.out.println(++i+"."+it.next());
} else {
save(input);
System.out.println(input);
} // if(input.equalsIgnoreCase("q")) {
} catch(Exception e) {
System.out.println("입력오류입니다.");
}
} // while(true)
} // main()
public static void save(String input) {
// queue에 저장한다.
if(!"".equals(input)) //if(input!=null && !input.equals(""))
q.offer(input);
// queue의 최대크기를 넘으면 제일 처음 입력된 것을 삭제한다.
if(q.size() > MAX_SIZE) // size()는 Collection인터페이스에 정의
q.remove();
}
}// end of class
- `!"".equals(input))`은 `input!=null && !input.equals("")`와 같다. 후자가 아닌 전자로 쓴 이유는 코드를 줄여쓰기 위해서이다. ""은 null이 나올 수 없고, 만약 `input!=null`이라는 조건을 안 넣어주면 `!input.equals("") ` 이 과정에서 `NullPointException`이 나올 수 있기 때문이다.
- 이클립스에서 우클릭 -> Open Declaration 클릭 한 후, 클래스나 인터페이스에서 ctrl+o하면 멤버의 목록이 나온다.
- for문에 list.size()를 직접 넣는 것보다 바뀌지 않으므로 SIZE를 넣는 것이 좋다. 반복횟수가 많을수록 차이가 나기 때문이다.
출처
'🎥Back > 자바의 정석' 카테고리의 다른 글
[JAVA의 정석]Arrays (0) | 2024.01.17 |
---|---|
[JAVA의 정석]Iterator, Enumeration, Map과 Iterator (0) | 2024.01.16 |
[JAVA의 정석]Stack과 Queue (0) | 2024.01.16 |
[JAVA의 정석]LinkedList (0) | 2024.01.16 |
[JAVA의 정석]ArrayList (0) | 2024.01.16 |