자료구조 (LinkedList, Stack, Queue)

이진석·2022년 8월 16일
1
post-thumbnail

20220815

한 번에 끝내는 Java/Spring 웹 개발 마스터

  • 자료구조
  • 슬슬 대학생때 가장 이해하기 어려웠던 부분에 대해서 배우기 시작하고 있다. 자료구조에 대한 부분이다.

1) LinkedList

package ch03;

public class MyLinkedList {
	private MyListNode head;
	int count;

	public MyLinkedList() {
		head = null;
		count = 0;
	}

	public MyListNode addElement(String data) {

		MyListNode newNode;
		if (head == null) { // 맨 처음일때
			newNode = new MyListNode(data);
			head = newNode;
		} else {
			newNode = new MyListNode(data);
			MyListNode temp = head;
			while (temp.next != null) // 맨 뒤로 가서
				temp = temp.next;
			temp.next = newNode;
		}
		count++;
		return newNode;
	}

	public MyListNode insertElement(int position, String data) {
		int i;
		MyListNode tempNode = head;
		MyListNode newNode = new MyListNode(data);

		if (position < 0 || position > count) {
			System.out.println("추가 할 위치 오류 입니다. 현재 리스트의 개수는 " + count + "개 입니다.");
			return null;
		}

		if (position == 0) { // 맨 앞으로 들어가는 경우
			newNode.next = head;
			head = newNode;
		} else {
			MyListNode preNode = null;
			for (i = 0; i < position; i++) {
				preNode = tempNode;
				tempNode = tempNode.next;

			}
			newNode.next = preNode.next;
			preNode.next = newNode;
		}
		count++;
		return newNode;
	}

	public MyListNode removeElement(int position) {
		int i;
		MyListNode tempNode = head;

		if (position >= count) {
			System.out.println("삭제 할 위치 오류입니다. 현재 리스트의 개수는 " + count + "개 입니다.");
			return null;
		}

		if (position == 0) { // 맨 앞을 삭제하는
			head = tempNode.next;
		} else {
			MyListNode preNode = null;
			for (i = 0; i < position; i++) {
				preNode = tempNode;
				tempNode = tempNode.next;
			}
			preNode.next = tempNode.next;
		}
		count--;
		System.out.println(position + "번째 항목 삭제되었습니다.");

		return tempNode;
	}

	public String getElement(int position) {
		int i;
		MyListNode tempNode = head;

		if (position >= count) {
			System.out.println("검색 위치 오류 입니다. 현재 리스트의 개수는 " + count + "개 입니다.");
			return new String("error");
		}

		if (position == 0) { // 맨 인 경우

			return head.getData();
		}

		for (i = 0; i < position; i++) {
			tempNode = tempNode.next;

		}
		return tempNode.getData();
	}

	public MyListNode getNode(int position) {
		int i;
		MyListNode tempNode = head;

		if (position >= count) {
			System.out.println("검색 위치 오류 입니다. 현재 리스트의 개수는 " + count + "개 입니다.");
			return null;
		}

		if (position == 0) { // 맨 인 경우

			return head;
		}

		for (i = 0; i < position; i++) {
			tempNode = tempNode.next;

		}
		return tempNode;
	}

	public void removeAll() {
		head = null;
		count = 0;

	}

	public int getSize() {
		return count;
	}

	public void printAll() {
		if (count == 0) {
			System.out.println("출력할 내용이 없습니다.");
			return;
		}

		MyListNode temp = head;
		while (temp != null) {
			System.out.print(temp.getData());
			temp = temp.next;
			if (temp != null) {
				System.out.print("->");
			}
		}
		System.out.println("");
	}

	public boolean isEmpty() {
		if (head == null)
			return true;
		else
			return false;
	}

}

LinkedList에 대한 부분이다.

  • 알고 있는 것은 데이터가 포인터와 주소를 사용하여 연결하는 것으로 알고 있고, 각 데이터를 노드라고 부르는 것으로 알고 있다.
  • LinkedList가 어떻게 생겼는지에 대해서 인식하기 시작하였더니, 코딩 자체는 크게 어렵지 않았다.

2) Stack

package ch04;

import ch02.MyArray;

public class MyArrayStack {

	MyArray arrayStack;
	int top;

	public MyArrayStack() {
		top = 0;
		arrayStack = new MyArray();
	}

	public MyArrayStack(int size) {
		top = 0;
		arrayStack = new MyArray(size);
	}

	public void push(int data) {

		if (isFull()) {
			System.out.println("stack if Full");
			return;
		}
		arrayStack.addElement(data);
		top++;
	}

	public int pop() {

		if (isEmpty()) {
			System.out.println("stack if Empty");
			return MyArray.ERROR_NUM;
		}
		return arrayStack.removeElement(--top);
	}

	public int peek() {

		if (isEmpty()) {
			System.out.println("stack if Empty");
			return MyArray.ERROR_NUM;
		}
		return arrayStack.removeElement(--top);
	}

	public boolean isFull() {

		if (top == arrayStack.ARRAY_SIZE) {
			return true;
		} else
			return false;
	}

	public boolean isEmpty() {

		if (top == 0) {
			return true;
		} else
			return false;
	}
}

Stack(스택)이다.

  • Stack을 이해할때 영어단어의 의미로 이해했는데, 쌓다 라는 뜻을 가진 stack은 점차 유리병 안에 모래를 쌓아서 넣는것처럼 데이터를 하나씩 쌓아두고 먼저 들어간 자료가 나중에 나오는 후입선출 구조를 가지고 있다.
  • 그래서 코딩할때 나중에 들어온 top부분이 쌓이면 늘어나고 빠지게 되면 가장 먼저 줄어드는 구조로 코딩한것으로 이해한다.

3) Queue

package ch05;

import ch03.MyLinkedList;
import ch03.MyListNode;

interface IQueue {
	public void enQueue(String data);

	public String deQueue();

	public void printAll();
}

public class MyListQueue extends MyLinkedList implements IQueue {

	MyListNode front;
	MyListNode rear;

	public MyListQueue() {
		front = null;
		rear = null;
	}

	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");
	}

	public String deQueue() {
		if (isEmpty()) {
			System.out.println("Queue is Empty");
			return null;
		}
		String data = front.getData();
		front = front.next;
		if (front == null) { // 마지막 항목
			rear = null;
		}
		return data;
	}

	public void printAll() {
		if (isEmpty()) {
			System.out.println("Queue is Empty");
			return;
		}
		MyListNode temp = front;
		while (temp != null) {
			System.out.print(temp.getData() + ",");
			temp = temp.next;
		}
		System.out.println();
	}
}

Queue이다.

  • Queue는 스택과 비슷한 구조지만, 후입선출인 Stack과 다르게 선입선출로 되어있다. 한쪽이 막힌 유리병이 Stack이고 빨대가 queue라고 이해하니 이해가 쉬웠다.
  • 빨대처럼 양쪽이 뚫려있지만, front와 rear를 통해서 자료의 삽입이 수행될 부분과 삭제과 수행될 부분을 정하고, dequeue와 enqueue를 통해 자료의 삭제와 삽입이 진행된다.

  • 대학교 때도 자료구조에 대한 부분이 이해가 가장 어려웠어서 많은 시간을 투자해서 공부중이다.
  • 하지만, 2번째 듣는 부분이라서 이해가 잘 가고, 유리병이나 빨대에 비유해서 스스로 생각하게 되니 이해가 잘 되는듯 하여 한발짝 나아가고 있는 기분이 들어서 기분이 좋다.
profile
혼자서 코딩 공부하는 전공생 초보 백엔드 개발자 / https://github.com/leejinseok0614

0개의 댓글