Leeyebin의 블로그
[2017.05.15~2017.05.19] 자료구조 2/5 본문
이미지 출처 : http://way2java.com/arrays/one-dimensional-arrays/
순차 자료구조(순차리스트)
ex)배열
*생성시에 크기가 결정된다.(요소(데이터 갯수)의 수)
*Data 중간 삭제, 삽입될 때 -> 요소이동에 따른 오버헤드
=> java.util.ArrayList
내부적으로 배열 구현
add(요소)
set(index, 요소)
추가, 삭제 시 오버헤드 발생
등
Collection(Reference) Vector는 멀티스레딩 환경을 대비해서 만들어졌고 이후에 ArrayList는 단일 쓰레딩 환경으로 대비해서 만들어짐.
Vector
주소: https://docs.oracle.com/javase/8/docs/api/java/util/Vector.html
Vector() Capacity
처음에는 size 10으로 잡았다가 11이 되면 20으로 늘리고 21이 되면 40으로 늘려서 복사한다.
#연결 리스트
이미지 출처 : https://crunchify.com/how-to-iterate-through-linkedlist-instance-in-java/
순차 자료구조의 문제점
- 삽입연산이나 삭제연산 후에 원소들을 이동시키는 추가적인 작업고 시간 소요
- 순차 자료구조는 배열을 이용하여 구현하기 때문에 메모리 사용의 비효율성 문제를 그대로 가짐
- 순차 자료구조에서의 연산 시간, 저장 공간에 대한 문제를 개선한 자료 표현 방법이 필요
연결 자료구조
- 자료의 논리적인 순서와 물리적인 순서가 일치하지 않는 자료구조
- 각 원소에 저장되어 있는 다음 원소의 주소에 의해 순서가 연결되는 방식
- 여러 개의 작은 공간을 연결하여 하나의 전체 자료구조를 표현
- 연결하는 방식에 따라 단순 연결 리스트와 원형 연결 리스트, 이중 연결 리스트, 이중 원형 연결 리스트
노드
- 연결 자료구조에서 하나의 원소를 표현하기 위한 단위 구조
- 데이터 필드(원소 값 저장, 저장할 원소의 형태에 따라서 하나 이상의 필드로 구성)
- 링크 필드(다음 노드의 주소를 저장, 포인터 변수를 사용하여 주소값을 저장)
리스트 이름 - 연결 리스트의 시작을 가리키는 포인터 변수(연결 리스트의 첫번째 노드를 가리키는 동시에 리스트 전체를 의미)
연결 리스트의 마지막 노드의 링크필드 - 노드의 끝을 표시하기 위해서 null(널) 저장
공백 연결 리스트 - 포인터변수에 null을 저장
이미지 출처 : http://www.java2novice.com/data-structures-in-java/linked-list/singly-linked-list/
단순 연결 리스트
-자유 공간 리스트
풀링에도 사용 가능
p76
삽입, 삭제가 빈번한 경우에는 연결 리스트가 오버헤드가 덜 일어 난다.
https://docs.oracle.com/javase/8/docs/api/java/util/LinkedList.html
////////////////////////////////////////////////////////////////////////////////////////////////////
p.s
boxing, unboxing
for each
가변 파라미터
제네릭타입
Collection타입의 클래스에 객체를 저장할 때 type 체크 안함
instanceof 타입체크해서 casting
ex) new Vector(); ===> Vector<String> vec = new Vector<String>();
////////////////////////////////////////////////////////////////////////////////////////////////////
이미지 출처 : http://www.geeksforgeeks.org/sorted-insert-for-circular-linked-list/
원형 연결 리스트
-단순 연결 리스트에서 마지막 노드가 리스트의 첫 번째 노드를 가리키게 하여 리스트의 구조를 원형으로 만든 연결 리스트
-삽입하는 노드 new는 리스트의 첫 번째 노드이자 마지막 노드가 되어야 함
이미지 출처 : http://www.java2novice.com/data-structures-in-java/linked-list/doubly-linked-list/
이중 연결 리스트
-양 방향으로 순회할 수 있도록 노드를 연결한 리스트
이미지 출처 : http://howtodoinjava.com/data-structure/java-stack-implementation-array/
//링크드 리스트 import java.io.PrintStream; import java.util.Iterator; import java.util.LinkedList; public class LinkedListTest { public static void main(String[] args) { LinkedList<string> list = new LinkedList(); String[] cars = { "아우디", "벤츠", "BMW", "마이바흐", "포르쉐" }; String[] arrayOfString1; int j = (arrayOfString1 = cars).length; for (int i = 0; i < j; i++) { String s = arrayOfString1[i]; list.add(s); } Iterator<string> iter = list.iterator(); while (iter.hasNext()) { System.out.println((String)iter.next()); } } }
#스택
- 접시를 쌓듯이 자료를 차곡차곡 쌓아 올린 형태의 자료구조
- 스택에 저장된 원소는 top으로 정한 곳에서만 접근 가능
- top의 위치에서만 원소를 삽입하므로 먼저 삽입한 원소는 밑에 쌓이고, 나중에 삽입한 원소는 위에 쌓인다.
- 후입선출 구조(ex: 연탄 교체할 때)
스택의 연산
삽입 : push
삭제 : pop
스택의 push 알고리즘
- top <- top+1;
- S(top) <- x;
스택의 pop 알고리즘
- return S(top);
- top <- top-1;
순차 자료구조로 구현한 스택의 장점
-순차 자료구조인 1차원 배열을 사용하여 쉽게 구현
순차 자료구조로 구현한 스택의 단점
-물리적으로 크기가 고정된 배열을 사용하므로 스택의 크기 변경 어려움
-순차 자료구조의 단점을 그대로 가지고 있다.
함수의 호출에도 스택을 사용한다.
//스택 public class StackTest { public static void main(String[] args) { Stack<string> list = new Stack(); String[] cars = { "아우디", "벤츠", "BMW", "마이바흐", "포르쉐" }; String[] arrayOfString1; int j = (arrayOfString1 = cars).length; for (int i = 0; i < j; i++) { String s = arrayOfString1[i]; list.push(s); } while (!list.isEmpty()) { System.out.println((String)list.pop() + ", 남은요소" + list.size()); } } }
//스택을 사용한 괄호 짝({[]}) 확인 소스 import java.io.PrintStream; import java.util.Scanner; import java.util.Stack; public class PairTest { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("입력 : "); Stackstack = new Stack(); String sentence = scanner.next(); for (int i = 0; i < sentence.length(); i++) { switch (sentence.charAt(i)) { case '(': case '[': case '{': stack.push(Character.valueOf(sentence.charAt(i))); break; case '}': if (((Character)stack.peek()).charValue() == '{') { stack.pop(); } break; case ')': if (((Character)stack.peek()).charValue() == '(') { stack.pop(); } break; case ']': if (((Character)stack.peek()).charValue() == '[') { stack.pop(); } break; } } if (stack.empty()) { System.out.println("true"); } else { System.out.println("false"); } } }
/////////////////////////////////////////////////////////////////////////////////////////////////
Set - 중복 객체 저장 안함, 순서 보장 안됨
//HashSet //TreeSet import java.io.PrintStream; import java.util.HashSet; import java.util.Iterator; import java.util.TreeSet; public class SetTest { public static void main(String[] args) { String[] cars = { "아우디", "벤츠", "BMW", "마이바흐", "포르쉐" }; HashSet<string> hset = new HashSet(); TreeSet<string> tset = new TreeSet(); String[] arrayOfString1; int j = (arrayOfString1 = cars).length; for (int i = 0; i < j; i++) { String s = arrayOfString1[i]; hset.add(s); tset.add(s); } Iterator<string> iter = hset.iterator(); System.out.print("hashset => "); while (iter.hasNext()) { System.out.print((String)iter.next() + " "); } System.out.println(); System.out.print("treeset => "); iter = tset.iterator(); while (iter.hasNext()) { System.out.print((String)iter.next() + " "); } } }
'외부 > 교육' 카테고리의 다른 글
[2017.05.15~2017.05.19] 자료구조 4/5 (0) | 2017.05.18 |
---|---|
[2017.05.15~2017.05.19] 자료구조 3/5 (0) | 2017.05.18 |
[2017.05.15~2017.05.19] 자료구조 1/5 (0) | 2017.05.15 |
[2017.04.27~2017.04.28] DevOpse with Docker 2/2 (0) | 2017.04.28 |
[2017.04.27~2017.04.28] DevOpse with Docker 1/2 (0) | 2017.04.27 |