선형 자료 구조란 자료를 구성하는 원소를 하나씩 순차적으로 나열시킨 형태이다. 자료들간의 앞, 뒤 관계가 1:1 관계이다.
class Node {
int data; // 데이터를 저장하는 변수
Node next; // 다음 노드를 가리키는 링크(포인터)
public Node(int data) {
this.data = data;
this.next = null; // 초기에는 다음 노드를 가리키는 링크가 없으므로 null로 설정
}
}
class LinkedList {
Node head; // 첫 번째 노드를 가리키는 헤드(포인터)
public LinkedList() {
this.head = null; // 초기에는 헤드가 null인 빈 LinkedList
}
// 노드를 LinkedList의 맨 끝에 추가하는 메서드
public void append(int data) {
Node newNode = new Node(data); // 새로운 노드 생성
if (head == null) {
// LinkedList가 비어있는 경우, 헤드로 설정
head = newNode;
} else {
Node current = head;
while (current.next != null) {
current = current.next; // 마지막 노드까지 이동
}
current.next = newNode; // 마지막 노드의 다음 링크에 새로운 노드를 연결
}
}
// LinkedList의 모든 요소를 출력하는 메서드
public void display() {
Node current = head;
while (current != null) {
System.out.print(current.data + " "); // 현재 노드의 데이터 출력
current = current.next; // 다음 노드로 이동
}
System.out.println();
}
}
public class Main {
public static void main(String[] args) {
LinkedList list = new LinkedList(); // LinkedList 인스턴스 생성
list.append(1); // LinkedList에 1을 추가
list.append(2); // LinkedList에 2를 추가
list.append(3); // LinkedList에 3을 추가
list.display(); // LinkedList의 모든 요소를 출력 (1 2 3)
}
}
import java.util.ArrayList;
public class ArrayListExample {
public static void main(String[] args) {
int[] numbers = new int[5];
//배열에 값 할당
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
numbers[3] = 40;
numbers[4] = 50;
//배열의 값 참조
System.out.println(numbers[2]);
//배열의 길이
System.out.println(numbers.length); // 5
//배열 반복문 순회
for (int i = 0; i < numbers.length; i++) {
System.out.println(numbers[i]);
}
}
}
<주요 연산>
<Stack 클래스 사용한 경우>
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(10);
stack.push(20);
stack.push(30);
System.out.println("스택 크기: " + stack.size()); // 출력: 3
System.out.println("맨 위 데이터: " + stack.peek()); // 출력: 30
System.out.println("Pop한 데이터: " + stack.pop()); // 출력: 30
System.out.println("Pop한 데이터: " + stack.pop()); // 출력: 20
System.out.println("스택이 비어있는지 확인: " + stack.isEmpty()); // 출력: false
}
}
<Stack 직접 구현한 경우>
public class Stack {
private int maxSize; // 스택의 최대 크기
private int top; // 스택의 맨 위 인덱스
private int[] stackArray; // 스택을 위한 배열
public Stack(int size) {
maxSize = size;
stackArray = new int[maxSize];
top = -1; // 스택이 비어있는 상태를 나타내기 위해 -1로 초기화
}
public void push(int data) {
if (top == maxSize - 1) {
System.out.println("스택이 가득 찼습니다.");
return;
}
stackArray[++top] = data; // 스택의 맨 위에 데이터 추가
}
public int pop() {
if (isEmpty()) {
System.out.println("스택이 비어있습니다.");
return -1;
}
return stackArray[top--]; // 스택의 맨 위 데이터 제거 후 반환
}
public int peek() {
if (isEmpty()) {
System.out.println("스택이 비어있습니다.");
return -1;
}
return stackArray[top]; // 스택의 맨 위 데이터 반환
}
public boolean isEmpty() {
return (top == -1); // 스택이 비어있는지 확인
}
public int size() {
return top + 1; // 스택에 저장된 데이터의 개수 반환
}
}
public class Main {
public static void main(String[] args) {
Stack stack = new Stack(5); // 크기가 5인 스택 생성
stack.push(10);
stack.push(20);
stack.push(30);
System.out.println("스택 크기: " + stack.size()); // 출력: 3
System.out.println("맨 위 데이터: " + stack.peek()); // 출력: 30
System.out.println("Pop한 데이터: " + stack.pop()); // 출력: 30
System.out.println("Pop한 데이터: " + stack.pop()); // 출력: 20
System.out.println("스택이 비어있는지 확인: " + stack.isEmpty()); // 출력: false
}
}
<기본 연산>
<Linked List를 활용해 Queue 구현>
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String[] args) {
// 큐 생성
Queue<Integer> queue = new LinkedList<>();
// enqueue: 큐에 항목 삽입
queue.offer(10);
queue.offer(20);
queue.offer(30);
// dequeue: 큐에서 항목 삭제 및 반환
int item = queue.poll();
System.out.println("Dequeued item: " + item);
// peek: 큐의 프론트(front) 항목 참조
int frontItem = queue.peek();
System.out.println("Front item: " + frontItem);
// isEmpty: 큐가 비어 있는지 확인
boolean isEmpty = queue.isEmpty();
System.out.println("Is queue empty? " + isEmpty);
// size: 큐의 크기 확인
int size = queue.size();
System.out.println("Queue size: " + size);
}
}
import java.util.LinkedList;
public class Queue<T> {
private LinkedList<T> queue; // LinkedList를 사용해 큐를 구현
public Queue() {
queue = new LinkedList<>();
}
public void enqueue(T item) {
queue.addLast(item); // 큐의 리어(rear)에 항목 추가
}
public T dequeue() {
if (isEmpty()) {
throw new IllegalStateException("Queue is empty.");
}
return queue.removeFirst(); // 큐의 프론트(front)에서 항목을 제거하고 반환
}
public boolean isEmpty() {
return queue.isEmpty(); // 큐가 비어 있는지 여부 반환
}
public int size() {
return queue.size(); // 큐의 현재 크기 반환
}
public T peek() {
if (isEmpty()) {
throw new IllegalStateException("Queue is empty.");
}
return queue.getFirst(); // 큐의 프론트(front)에 위치한 항목 반환
}
}
public class QueueExample {
public static void main(String[] args) {
Queue<Integer> queue = new Queue<>(); // 큐 생성
queue.enqueue(10); // 항목 삽입
queue.enqueue(20);
queue.enqueue(30);
System.out.println("Dequeued item: " + queue.dequeue()); // Dequeued item: 10
System.out.println("Front item: " + queue.peek()); // Front item: 20
System.out.println("Is queue empty? " + queue.isEmpty()); // Is queue empty? false
System.out.println("Queue size: " + queue.size()); // Queue size: 2
}
}
https://hoehen-flug.tistory.com/29
https://hoehen-flug.tistory.com/28
https://hoehen-flug.tistory.com/30
https://hoehen-flug.tistory.com/31?category=1077201