package test; import java.awt.*; import java.util.ArrayList; import javax.swing.*; class Queue { int max; ArrayList<String> queue; // 큐 정의 public Queue(int max) { this.max=max; queue=new ArrayList<>(max); } // 큐 삽입 public void enqueue(String e) { if(!is_full()) queue.add(e); else System.out.println("큐가 꽉 찼음!"); } // 큐 삭제 public String dequeue() { if(!is_empty()) { String r=queue.get(0); queue.remove(0); return r; } else { System.out.println("큐가 비었음!"); return null; } } // 큐가 비었는지 확인 public boolean is_empty() { if(queue.size()==0) return true; else return false; } // 큐가 꽉 찼는지 확인 public boolean is_full() { if(queue.size()==max) return true; else return false; } // 큐 사이즈 보내기 public int size() { return queue.size(); } // 큐 아이템 전체 보내기 public String[] pass() { String[] r=new String[queue.size()]; for(int i=0; i<queue.size(); i++) r[i]=queue.get(i); return r; } } public class test extends JFrame{ JTextField[] box=new JTextField[3]; Font font1 = new Font("SansSerif", Font.BOLD, 30); public test() { setTitle("Roulette"); setSize(400,300); setLocation(700,300); setLayout(new GridLayout(3,1)); setDefaultCloseOperation(EXIT_ON_CLOSE); for(int i=0; i<3; i++) { box[i]=new JTextField(15); box[i].setFont(font1); box[i].setForeground(new Color(128,128,128)); if(i==1) { box[i].setForeground(Color.black); box[i].setBackground(new Color(123,211,247));} box[i].setEditable(false); add(box[i]); } setVisible(true); } public static void main(String[] args) { test t=new test(); JTextField[] box=t.box; Queue q1=new Queue(10); Queue q2=new Queue(3); for(int i=0; i<q1.max; i++) q1.enqueue(i+""); for(int i=0; i<q2.max; i++) { String r=q1.dequeue(); q2.enqueue(r); } for(int i=0; i<150; i++) { try { Thread.sleep(10+i); // 0.01초부터 (0.1x)초로 서서히 딜레이 String[] qdata=q2.pass(); for(int j=0; j<3; j++) box[j].setText(qdata[2-j]); } catch (InterruptedException e) { // TODO Auto-generated catch block } String r=q2.dequeue(); q1.enqueue(r); String r2=q1.dequeue(); q2.enqueue(r2); } } }
0 -> 1,2,…, 9 -> 0 -> … 이 반복되며 룰렛을 구현하는 방식!
프로그램 로직
큐 2개를 만들어서
하나는 데이터를 저장하는 큐(q1)
나머지는 데이터를 보여주는 큐(q2)로 지정합니다!
q1와 q2를 반전된 모습으로 생각합니다.
1) q1에 나타낼 데이터를 모두 저장합니다.
Queue q1=new Queue(10); Queue q2=new Queue(3); for(int i=0; i<q1.max; i++) q1.enqueue(i+"");
데이터를 저장하는 큐 (빨간 색으로 표시)
데이터를 보여주는 큐 (파란 색으로 표시)
2) q1에서 q2의 용량만큼 데이터를 삭제하고, q2에 삽입합니다.
for(int i=0; i<q2.max; i++) { String r=q1.dequeue(); q2.enqueue(r); }
3) q2의 데이터를 한 개 삭제해서 q1에 삽입합니다.
4) q1의 데이터를 한 개 삭제해서 q2에 삽입합니다.
String r=q2.dequeue(); q1.enqueue(r); String r2=q1.dequeue(); q2.enqueue(r2);
5) (3)-(4) 과정을 반복합니다.
q2에는 데이터가 삭제되자마자 새로운 데이터가 삽입되므로,
계속 데이터가 한 칸씩 변하는 형태를 띕니다.
큐의 FIFO(먼저 들어온 데이터가 먼저 나가는 구조)를 이용해서 위처럼 문제를 해결할 수 있습니다!