코딩하렴

JAVA Queue/Stack 구현하기

by 으렴

자바를 활용해서 정수 값을 넣고 출력하는 것을 만들어 보았다.

data산출 방식인 Stack과 Queue 두가지 방식을 사용해서 선택하여 숫자를 출력하는 것이다. 

 

Queue는 선입선출로 data가 출력된다

Frist In Frist Out(FIFO)으로 먼저 들어간 data가 맨 먼저 나가는 형식이다.

 

위 그림과 같이 맨 먼저 push된 data A가 맨 첫번째로 pop되는 것을 볼 수 있다.

 

 

Stack방식은 다음 그림과 같다.

Stack은 위 그림처럼 컵과 같다.

맨 처음 들어간 data A는 맨마지막 들어간 C가 나오고 B가 나오고 나서야 맨 마지막에 나올 수 있다.

이러한 방식을 Frist In Last Out(FILO)이라고 한다.

 

1
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
package D0321;
 
import java.util.Scanner;
 
abstract class Memory {
 
    public int [] arr;
    public int buf,cnt;
    public Memory()
    {
        arr = new int [20];
        buf = 0;
        cnt = 0;
    }
    Scanner sc = new Scanner(System.in);
    
    public void push() 
    {
        System.out.println("push push baby~");
        buf = sc.nextInt();
        arr[cnt] = buf;
        if(arr[19]!=0){System.out.println("full");}        
        cnt++;
        
        System.out.println("complete!");
        
    }
    
    abstract void pop();
}
 
 
cs

 

Memory라는 class를 생성했다. 이 class는 추상클래스(abstract class)로 형성되었다.

그리고 추상 메소드( abstract method → pop )를 만들었다.

push는 Stack과 Queue의 공통된 함수로 활용 할 수 있기 때문에 부모class에 넣었다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

 

 

public class Queue extends Memory {
 
    
    Queue(){}
    
 
    @Override
    public void pop()
    {
        System.out.println("Queue pop");
        System.out.println(arr[0]);
        for(int i=1;i<arr.length;i++)
        {
            arr[i] = arr[i+1];
            if(arr[i]==0) {break;}
        }
        
    }
}
 
 
cs

Queue는 Memory class의 super class이다.

Queue의 pop은 항상 array의 0번째 숫자만 출력한다.

그렇기 때문에 0번째가 비지 않게 만들기 위해서 for문을 활용해서 앞으로 값을 당겨 넣어준다.
그리고 만약 arr[i]번째의 값이 0(null)일 경우 for문을 돌리지 말아라고 예외처리를 해준다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Stack extends Memory {
    
    Stack(){}
    
 
    @Override
    public void pop()
    {
        System.out.println("stack pop pop pop!");
        System.out.println(arr[--cnt]);
        
    }
}
cs

 

Stack은 cnt변수를 사용해서 count만큼의 배열 번째에 있는 값을 출력 할수 있게 만들었다.

 

1
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
package D0321;
 
import java.util.Scanner;
 
public class Menu {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Stack st = new Stack();
        Queue qu = new Queue();
        int mainum,num;
        
        while(true) {
        System.out.println("select 1. Stack 2. Queue");
        mainum = sc.nextInt();
        switch(mainum) 
        {
        case 1System.out.println("stack 1.push 2.pop");
                num= sc.nextInt();
                switch(num) 
                {
                    case 1: st.push();break;
                    case 2: st.pop();break;
                }
                break;
        case 2System.out.println("stack 1.push 2.pop");
                num= sc.nextInt();
                switch(num) 
                {
                    case 1: st.push();break;
                    case 2: st.pop();break;
                }
                break;
        case 3System.exit(0); break;
            default : System.out.println("err!"); break;
        
        }
        }
    }
}
 
cs

 

기본 메뉴로 Stack과 Queue를 has-a하고 있다.

예외처리는 되어있지 않다.

사이트의 정보

코딩하렴

으렴

활동하기