생성자
private int size; // 요소 개수
private int[] stack;
public Stack(int capacity) {
this.size = 0;
this.stack = new int[capacity];
}
public void resize() {
if (size == stack.length) {
int newSize = 2 * stack.length;
stack = Arrays.copyOf(stack, newSize);
}
}
public void push(int data) {
if (size == stack.length) {
resize();
}
stack[size] = data;
size++;
}
public int pop() {
if (size == 0) {
throw new RuntimeException("꺼낼 요소가 존재하지 않습니다.");
}
int pop = stack[size - 1];
stack[size - 1] = 0;
return pop;
}
public int peek() {
if (size == 0) {
throw new RuntimeException("stack에 요소가 존재하지 않습니다.");
}
return stack[size - 1];
}
생성자
private int[] queue;
private int front;
private int rear;
private int max;
public Queue(int size) {
this.queue = new int[size + 1];
this.front = 0;
this.rear = 0;
this.max = size + 1;
}
public void push(int data) {
if (isFull()) {
throw new RuntimeException("큐가 가득 찼습니다!");
}
rear = (rear + 1) % max;
queue[rear] = data;
}
public int poll() {
if (isEmpty()) {
throw new RuntimeException("큐가 비어있습니다!");
}
front = (front + 1) % max;
return queue[front];
}
public int size() {
if (front <= rear) {
return rear - front;
}
return max - front + rear;
}
public void clear() {
front = 0;
rear = 0;
}
public boolean isEmpty() {
return front == rear;
}
private boolean isFull() {
return (rear + 1) % max == front;
}
private int[][] graph;
public Graph1(int size) {
this.graph = new int[size + 1][size + 1];
}
public void addDirectEdge(int x, int y) { // 단방향 연결
graph[x][y] = 1;
}
public void addCompleteEdge(int x, int y) { // 양방향 연결
graph[x][y] = 1;
graph[y][x] = 1;
}
public void deleteDirectedEdge(int x, int y) {
graph[x][y] = 0;
}
public void deleteCompleteEdge(int x, int y) {
graph[x][y] = 0;
graph[y][x] = 0;
}
public void print() {
for (int[] ints : graph) {
for (int j = 0; j < graph.length; j++) {
System.out.print(ints[j] + " ");
}
System.out.println();
}
}
장점
구현이 간편하며, 노드끼리 연결되어 있는지를 확인하기 위해 graph[i][j]만 확인하면 된다.
단점
메모리가 많이 사용되며, 노드에 비해 간선이 적으면 비효율적인 구조를 가지게 된다.
private ArrayList<ArrayList<Integer>> graph;
public Graph2() {
graph = new ArrayList<ArrayList<Integer>>();
}
public void addDirectedEdge(int x, int y) {
graph.get(x).add(y);
}
public void addCompleteEdge(int x, int y) {
graph.get(x).add(y);
graph.get(y).add(x);
}
public void print() {
for (int i = 1; i < graph.size(); i++) {
System.out.print(i + " -> ");
for (int j = 0; j < graph.get(i).size(); j++) {
System.out.print(graph.get(i).get(j));
}
System.out.println();
}
}
ex) 1 -> 2 , 3
2 -> 4 , 5
3 -> 1 , 4
장점
노드가 어떤 노드들과 연결되어 있는지 알기 쉽다.
간선 갯수만큼만 메모리공간을 할당해, 인접행렬방식보다 적은 메모리공간을 사용한다.
단점
노드간 연결관계를 알고싶을 때, 인접행렬 방식보다 탐색속도가 느리다.
private int cnt; // 총 노드 갯수
public Tree() {
cnt = 0;
}
public class Node {
Object data;
Node left;
Node right;
public Node(Object data) {
this.data = data;
this.left = null;
this.right = null;
}
public void addLeft(Node node) {
this.left = node;
cnt++;
}
public void addRight(Node node) {
this.right = node;
cnt++;
}
public void deleteLeft() {
this.left = null;
cnt--;
}
public void deleteRight() {
this.right = null;
cnt--;
}
}
노드를 다른 노드와 연결하기 위해서는 해당 노드가 연결할 노드의 주소를 알아야 하기에 필드에 left노드와 right노드를 추가했다.
노드를 원하는 위치에 더하거나 제거하기위해서는 연결할 위치에 노드를 넣거나, null로 만들어 연결을 해제한 후 Tree의 총 노드 갯수를 갱신해주면 된다.
public Node addNode(Object data) {
return new Node(data);
}
addNode() : 기존 Node의 메소드들로는 Tree를 시작할 수 없기 때문에,
(노드를 아래에 붙이거나, 제거만 할 수 있다.)
부모노드를 addNode()를 통해 새로 생성해준다.
public void preOrder(Node node) { // 전위
if (node == null) {
return;
}
System.out.print(node.data + " ");
preOrder(node.left);
preOrder(node.right);
}
public void inOrder(Node node) { // 중위
if (node == null) {
return;
}
inOrder(node.left);
System.out.print(node.data + " ");
inOrder(node.right);
}
public void postOrder(Node node) { // 후위
if (node == null) {
return;
}
postOrder(node.left);
postOrder(node.right);
System.out.print(node.data + " ");
}
Node
static class Node {
private int data;
public Node nextNode;
public Node(int data) {
this.data = data;
this.nextNode = null;
}
public int getData() {
return this.data;
}
}
private Node head;
public LinkedList() {
head = null;
}
public void addNode(Node preNode, int data) {
Node newNode = new Node(data);
newNode.nextNode = preNode.nextNode;
preNode.nextNode = newNode;
}
public void addNode(int data) {
Node newNode = new Node(data);
if (head == null) {
head = newNode;
} else {
Node tmpNode = head;
while (tmpNode.nextNode != null) {
tmpNode = tmpNode.nextNode;
}
tmpNode.nextNode = newNode;
}
}
public void deleteNode(int data) {
Node preNode = head;
Node tmpNode = head.nextNode;
if (data == preNode.getData()) {
head = preNode.nextNode;
preNode.nextNode = null;
} else {
while (tmpNode != null) {
if (data == tmpNode.getData()) {
if (tmpNode.nextNode == null) {
preNode.nextNode = null;
} else {
preNode.nextNode = tmpNode.nextNode;
tmpNode.nextNode = null;
}
break;
} else {
preNode = tmpNode;
tmpNode = tmpNode.nextNode;
}
}
}
}
public void deleteNode() {
Node preNode;
Node tmpNode;
if (head == null) {
System.out.println("존재하는 노드가 없습니다!");
return;
}
if (head.nextNode == null) {
head = null;
} else {
preNode = head;
tmpNode = head.nextNode;
while (tmpNode.nextNode != null) {
preNode = tmpNode;
tmpNode = tmpNode.nextNode;
}
preNode.nextNode = null;
}
}
public Node searchNode(int data) {
Node tmpNode = head;
while (tmpNode != null) {
if (data == tmpNode.getData()) {
return tmpNode;
} else {
tmpNode = tmpNode.nextNode;
}
}
return tmpNode;
}
public void print() {
Node tmpNode = head;
while (tmpNode != null) {
System.out.print(tmpNode.getData() + " ");
tmpNode = tmpNode.nextNode;
}
System.out.println();
}