자바의 정석 - 스택과 큐(Stack & Queue)의 활용

Yohan·2024년 2월 9일
0
post-custom-banner

스택과 큐(Stack & Queue)의 활용

  • 스택의 활용 예
    • 수식계산, 수식괄호검사, 워드프로세서의 redo/undo, 웹브라우저의 뒤로/앞으로
  • 큐의 활용 예
    • 최근사용문서, 인쇄작업 대기목록, 버퍼(buffer)

실습

  • 스택
class Ex1 {
	public static void main(String[] args) {
		Stack st = new Stack();
		String expression = "((3+5*8-2)))";
		
		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("괄호가 일치하지 않습니다!!");
		}
	}
}
class Ex1 {
	static Queue q = new LinkedList();
	static final int MAX_SIZE = 5; // Queue에 최대 5개까지만 저장
	
	public static void main(String[] args) {
		System.out.println("help를 입력하면 도움말을 볼 수 있다.");
		
		while(true) {
			System.out.println(">>");
			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")) { // 대소문자 구분없이
					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; // 실제 객체가 LinkedList이기 때문에 LinkedList로 형변환
					
					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);
				} // if(input.equalsIgnoreCase("q")) {
			} catch(Exception e){
				System.out.println("입력오류입니다.");
			}
		}
	}
	
	// save메서드
	public static void save(String input) {
		if(!"".equals(input)) // 빈 문자열이 아니면 저장
			q.offer(input);
		
		// queue의 최대크기를 넘으면 제일 처음 입력된 것을 삭제
		if(q.size() > MAX_SIZE) // size()는 Collection인터페이스에 정의
			q.remove();
	}
}
profile
백엔드 개발자
post-custom-banner

0개의 댓글