코딩 기록들

Java 3. 스택, 큐 구현 본문

카테고리 없음

Java 3. 스택, 큐 구현

코딩펭귄 2023. 12. 22. 11:37

Stack의 특징

  • 맨 마지막 위치(top)에서만 자료를 추가,삭제, 꺼내올 수 있음 ( 중간의 자료를 꺼낼 수 없음)
  • 데이터를 - 제거해서 꺼내는것 : pop /// 넣는것 : push /// 제거하지않고 꺼내보기만 하는것 : pick
  • Last In First Out ( 후입선출 ) 구조
  • 택배 상자가 쌓여있는 모양
  • 가장 최근의 자료를 찾아오거나 게임에서 히스토리를 유지하고 이를 무를때 사용할 수 있음
  • 함수의 메모리는 호출 순서에 따른 stack 구조
  • jdk 클래스 : Stack

 

배열 활용하여 Stack 구현하기~

import ch02.MyArray;

public class MyArrayStack {

	//멤버변수는 이렇게만 써놔도 자동으로 초기화가 됨
	int top; // int = 0, 객체인경우 = null, boolean = false로 초기화됨
	MyArray arrayStack; 
	
	public MyArrayStack()
	{
		top = 0;
		arrayStack = new MyArray();
	}
	
	//사이즈가 들어올경우
	public MyArrayStack(int size)
	{	//사이즈만큼 initialize
		top = 0;
		arrayStack = new MyArray(size);
	}
	
	//집어넣을때 - 배열이므로 꽉 찼는제 체크하기 -> 꽉찼으면 넣을수없음
	public void push(int data)
	{
		if(isFull()){ //꽉찼으면 에러메세지 
			System.out.println("stack is full");
			return;
		}
		arrayStack.addElement(data);
		top++; //배열의 맨뒤로 쭉쭉 들어가는것
	}
	
	public int pop()
	{
		if (top == 0){ //없다는것
			System.out.println("stack is empty");
			return MyArray.ERROR_NUM;
		}
		return arrayStack.removeElement(--top); //먼저 감소시키고 operation 진행
		
	}
	
	public boolean isFull()
	{
		if(top == arrayStack.ARRAY_SIZE){
			return true; // 꽉찼으면 return true(꽉찼다는 의미)
		}
		else return false;
	}
	
	public boolean isEmpty()
	{
		if (top == 0){
			System.out.println("stack is empty");
			return true;
		}
		else return false;
	}
	
	//어느데이터가 있는지 보는 것
	public int peek()
	{
		if (top == 0){
			System.out.println("stack is empty");
			return MyArray.ERROR_NUM;
		}
		return arrayStack.getElement(top-1);
	}
	
	public int getSize()
	{
		return top;
	}
	
	
	public void printAll()
	{
		arrayStack.printAll();
	}
}
public class MyArrayStackTest {

	public static void main(String[] args) {

		MyArrayStack stack = new MyArrayStack(3); //3개로 안만들고 디폴트로하면 10개 만들어짐
		
		stack.push(10);
		stack.push(20);
		stack.push(30);
		stack.push(40);
		
		stack.printAll();
		
		System.out.println("top element is " + stack.pop());
		stack.printAll();
		System.out.println("stack size is " + stack.getSize());
		
		System.out.println("stack.pop()");
		System.out.println("stack.push()");
		System.out.println("stack.peek()");
	}
}

 

Queue 구현하기

  • 맨 앞(front) 에서 자료를 꺼내거나 삭제하고, 맨 뒤(rear)에서 자료를 추가 함
  • Fist In First Out (선입선출) 구조
  • 일상 생활에서 일렬로 줄 서 있는 모양
  • 순차적으로 입력된 자료를 순서대로 처리하는데 많이 사용 되는 자료구조
  • 콜센터에 들어온 문의 전화, 메세지 큐 등에 활용됨
  • jdk 클래스 : ArrayList

LinkedList로 Queue구현하기

import ch03.MyLinkedList;
import ch03.MyListNode;

interface Queue{
	public void enQueue(String data);
	public String deQueue();
	public void printQueue();
}	

public class MyLinkedQueue extends MyLinkedList implements Queue {

	MyListNode front;
	MyListNode rear;
	
	//MyLinkedList의 addElement() 사용해서 string 타입으로 enQueue 
	@Override
	public void enQueue(String data) {
		MyListNode newNode;
		if( isEmpty()) { 
			//비어있는 큐에 맨 처음으로 들어가는 경우
			newNode = addElement(data);
			front = newNode;
			rear = newNode;
		}
		else {
			//큐의 맨 뒤에 들어가는 경우
			newNode = addElement(data);
			rear = newNode;
		}
		System.out.println(newNode.getData() + "added");
	}

	//제거 : remove는 0위치에서 하면 됨
	//MyLinkedList의 removeElement(int position) 사용해서 position을 0으로 하면 젤앞에서 deQueue
	@Override
	public String deQueue() {
		if(isEmpty()) {
			//큐가 비어있으면 deQueue작업 하지 못하므로 에러(null)발생
			return null;
		}
		String data = front.getData();
		front = front.next;
		
		if(front == null) {
			//마지막 항목 이라는 뜻
			rear= null;
		}
		return data;
	}

	@Override
	public void printQueue() {
		printAll();
	}

}
public class MyListQueueTest {

	public static void main(String[] args) {
		
		MyLinkedQueue listQueue = new MyLinkedQueue();
		listQueue.enQueue("A");
		listQueue.enQueue("B");
		listQueue.enQueue("C");

		listQueue.printAll();
		
		//deQueue의 반환값은 String이므로 System.out으로 출력
		System.out.println(listQueue.deQueue());
		System.out.println(listQueue.deQueue());
		
	}

}

 

출력

 

Aadded
Badded
Cadded
A->B->C
A
B