IT_Note


스택 예제 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는 가장 근접한 최근곡을 이전곡으로 설정 해야 하는데, 큐로 하게되면

그게 불가능. 걍 처음넘어간 것만