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(먼저 들어온 데이터가 먼저 나가는 구조)를 이용해서 위처럼 문제를 해결할 수 있습니다!