Programming/Java_자바

[JAVA 기초] 스택(Stack), 큐(Queue), 해시세트(HashSet) 구현 및 실습

LEFT 2022. 1. 16. 15:17

Explain


스택 (Stack)

: 하노이탑에 개체를 쌓듯 데이터가 LIFO(Last-In First-Out) 구조로 쌓이는 자료구조

큐 (Queue)

: 가로형태의 원통형 구조라고 가정할 수 있고, 맨 좌측 front, 맨 우측 rear(꼬리) 의 자료구조
: 데이터가 FIFO(First-In First-Out) = 가장 먼저 들어간 것이 가장 먼저 나오는 구조

해시세트 (HashSet)

: Set 인터페이스의 구현 클래스로 객체를 중복해서 저장할 수 없고
: 하나의 null 값만 저장할 수 있는 Set의 성질을 그대로 상속받음
>> 저장순서가 중요하지 않음
>> 같은 Set 인터페이스의 하위 클래스 중 TreeSet은 데이터를 자동정렬해주는 특징이 있지만 HashSet은 그렇지 않음


실습코드 

<StackTest.java>

package chapter12_collection.arraylist;

import java.util.ArrayList;

class MyStack
{
	private ArrayList<String> arrayStack = new ArrayList<String>();
	public void push(String data) // 스택의 데이터 추가 push 구현
	{
		arrayStack.add(data);
	}
	
	
	public String pop()
	{
		int len = arrayStack.size(); // 스택의 사이즈를 len으로 간편히 표현
		
		if(len ==  0) // 스택에 들어있는 데이터가 없으면
		{
			System.out.println("스택이 비었습니다");
			return null;
		}
		
		String data = arrayStack.remove(arrayStack.size() - 1); // 스택은 맨 뒤의 데이터를 삭제하므로 구현한 방법
		return data;
	}
	
	
	public String peek() // pop과는 달리 맨 위의 값을 단지 꺼내기만하므로 pop()메서드 코드와 동일하고, 밑 return부분만 수정해줌.
	{
		int len = arrayStack.size(); // 스택의 사이즈를 len으로 간편히 표현
		
		if(len ==  0) // 스택에 들어있는 데이터가 없으면
		{
			System.out.println("스택이 비었습니다");
			return null;
		}
		
		String data = arrayStack.get(arrayStack.size() - 1); // get()함수로 단지 꺼내기만하는 기능 구현
		return data;
	}
}

public class StackTest {

	public static void main(String[] args) {
		
		MyStack stack = new MyStack();
		
		stack.push("A"); // 데이터 삽입
		stack.push("B");
		stack.push("C");
		
		System.out.println(stack.pop()); // c 반환
		System.out.println(stack.pop()); // b 반환
		System.out.println(stack.pop()); // a 반환
		
		System.out.println(stack.pop()); // 스택이 비어있음.	
	}

}

Result


<QueueTest.java>

package chapter12_collection.arraylist;

import java.util.ArrayList;

class MyQueue
{
	private ArrayList<String> arrayQueue = new ArrayList<String>();
	
	public void enQueue(String data) // enQueue의 경우는 삽입의 경우이므로 반환할 값이 없으므로 void로 반환할 데이터 타입을 정하지 않음을 보인다.
	{
		arrayQueue.add(data);
	}
	
	public String deQueue() // deQueue의 경우는 삭제의 경우이므로 반환데이터형이 있어야하므로 enQueue에서 지정했던 String을 그대로 적어준다.
	{
		int len = arrayQueue.size(); // 큐의 사이즈를 len으로 관리
		
		if(len == 0) // 스택과 마찬가지로 자료공간이 비어있을 경우의 예외를 만듦
		{
			System.out.println("큐가 비었습니다.");
			return null;
		}
		
		return arrayQueue.remove(0); // 실제로 반환값을 주고 실제값도 지워짐. get과는 다른 개념. 개념은 단지 꺼내주기만함
	}
}

public class QueueTest {

	public static void main(String[] args) {
		MyQueue queue = new MyQueue();
		
		queue.enQueue("A"); // 데이터 삽입
		queue.enQueue("B"); // 데이터 삽입
		queue.enQueue("C"); // 데이터 삽입
		
		System.out.println(queue.deQueue()); // A 반환
		System.out.println(queue.deQueue()); // B 반환
		System.out.println(queue.deQueue()); // C 반환
		
		System.out.println(queue.deQueue()); // 큐가 비어있음.	
	}
}

Result


<HashSetTest.java>

package chapter12_collection.hashset;

import java.util.HashSet;

public class HashSetTest {

	public static void main(String[] args) {
		HashSet<String> set = new HashSet<String>();
		
		set.add("aaa");
		set.add("bbb");
		set.add("ccc");
		System.out.println(set); // HashSet에는 toString 이 구현이 되어있으므로 바로 출력 가능
		
		
		set.add("aaa"); 		 // 이처럼 추가를 해도 중복을 허용하지 않기 때문에
		System.out.println(set); // 똑같은 출력값을 가진다.
	}


}

중복을 허용하지 않는다는 것을 확인하기 위해 논리형으로
출력해 확인할 수 있다.

Result

 

package chapter12_collection.hashset;

import java.util.HashSet;

public class HashSetTest {

	public static void main(String[] args) {
		HashSet<String> set = new HashSet<String>();
		
		boolean d1 = set.add("ddd");
		set.add("aaa");
		set.add("bbb");
		set.add("ccc");
        
		System.out.println(d1);
		
		boolean d2 = set.add("ddd"); // 이처럼 추가를 해도 중복을 허용하지 않기 때문에
		System.out.println(d2); // 똑같은 출력값을 가진다.
		
		// 처럼 추가해주면, d1출력값은 true = 잘 삽입되어있음을 확인가능
		// d2출력값은 false = 중복을 허용하지 않아 삽입이 되어있지않음으로 확인이 가능하다.
		
	}


}

Result