스택 예제 MP3플레이어. JAVA
스택사용 예제
큐로 했을경우 뭐가 문제인지 생각해보기
- 사용되는 스택은 총 2개 before 과 next 이전곡 / 다음곡을 담아둘 스택.
- 스택은 클래스배열 형태로 넣어주는데 int num은 곡번호, String info배열은 제목과 가수명
- Scanner 이용해서 조작할 수 있게함. n b s p.
- 이전곡/다음곡이 없을경우 등 상황처리
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | class St{ int num; //번호 String info []; //제목,내용 public St(int num,String sub,String con) { this.num=num; this.info = new String[]{sub,con}; } @Override public String toString() { // 주소값을 내용으로 변환. return num + Arrays.toString(info); } } public class Mp3 { Stack<St> before = new Stack<St>(); // 이전곡 Stack<St> next = new Stack<St>(); //다음곡 St now = null; //현재곡 boolean backchk(){//뒤로가기 로직 boolean res = !before.empty();//비어있으면, false if(res){ //이전곡 잇을경우 현재곡을 이전곡으로 설정. if(now!=null){ //현재곡이 존재할경우 현재곡을 다음곡으로 push next.push(now); } now = before.pop(); // ★현재곡은 이전곡으로. } return res; } void backtr(){ //뒤로가기 조작 System.out.println("← 이전곡 재생버튼"); if(backchk()){ print(); } else{ System.out.println("※※※ 이전곡이 없습니다"); } } boolean nextchk(){ boolean res = !next.empty();//다음곡이 비어잇는게 아니면 if(res){// 다음곡 있을경우. if(now!=null){ before.push(now); } now = next.pop(); //현재곡은 다음곡으로 설정 } return res; } void nexttr(){ //다음곡 조작. System.out.println("→ 다음곡 재생버튼"); if(nextchk()){//잘 됫을경우 print(); } else{ System.out.println("※※※ 다음곡이 없습니다."); } } void stop(){ //스탑 System.out.println("곡을 멈춥니다."); if(now!=null){ //현재곡이 있을경우. next.push(now); //다음곡에 현재곡 저장. now=null;//현재곡은 비움. print(); }else{ System.out.println("※※※ 실행중인 곡이 없습니다."); } } void play(){ System.out.println("mp3를 시작합니다"); if(now==null){//멈춰 있는 상태일 경우. now=next.pop();//now에 다음곡 입력해줌. print(); }else{ System.out.println("※※※ 이미 실행중입니다"); print(); } } void play(int num){ //해당번호 곡 재생하기 미구현 } public Mp3() {//생성자, 내용입력, next.push(new St(6, "제목6", "내용6")); next.push(new St(5, "제목5", "내용5")); next.push(new St(4, "제목4", "내용4")); next.push(new St(3, "제목3", "내용3")); next.push(new St(2, "제목2", "내용2")); next.push(new St(1, "제목1", "내용1")); } void print(){ //현재상태 출력 System.out.println("\n이전곡"+before); System.out.println("현재곡"+now); System.out.println("다음곡"+next+"\n"); } public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); Mp3 mp3 = new Mp3(); System.out.println("★빠밤~ mp3전원이 켜졌습니다.★ \n 조작방법 - 재생:p/멈춤:s/다음곡:n/이전곡:b 입력"); while(true){ String input = sc.next(); switch (input) { case "b": mp3.backtr(); break; case "n": mp3.nexttr(); break; case "s": mp3.stop(); break; case "p": mp3.play(); break; default: break; } } } } | cs |
큐로 했을경우 FIFO이기 때문에,
이전곡 다음곡 이동시에 꼬여버리는 현상이 나타난다.
LIFO같은경우 가장 마지막에 했던것이 POP된다.
FIFO는 가장 근접한 최근곡을 이전곡으로 설정 해야 하는데, 큐로 하게되면
그게 불가능. 걍 처음넘어간 것만