CS/Data Structure

[자료구조] Stack, Queue, Deque

창문닦이 2019. 2. 5. 23:59

1. Stack

- 리스트의 한쪽 끝으로만 자료의 삽입, 삭제 작업이 이루어지는 자료구조이다.
- LIFO : Last In First Out 방식으로 자료를 처리한다 .
- 사용용도

  • 서브 프로그램 호출 시 복귀 주소를 저장할 때
  • 함수 호출의 순서 제어
  • 인터럽트가 발생하여 복귀 주소를 저장할 때
  • 후위 표기법으로 표현된 산술식 연산
  • 0 주소 지정방식 명령어의 자료 저장소
  • 재귀프로그램의 순서 제어
  • 컴파일러를 이용한 언어 번역
Top : Stack으로 할당된 기억공간에 가장 마지막으로 삽입된 자료가 기억된 위치를 가리키는 요소. 스택 포인터
Bottom : 스택의 가장 밑바닥
Push : 스택에 자료 입력
Pop : 스택에서 자료 출력

 

package com;

import java.util.EmptyStackException;

class Stack<T>{
	class Node<T>{ //같은 타입을 받는 노드 선언
		private T data;
		private Node<T> next;
		public Node(T data){ //생성자를 통해 내부변수에 저장
			this.data = data;
		}
	}
	
	private Node<T> top;//포인터
	
	public T pop(){//맨위에 있는 데이터를 반환하는 메소드
		if (top == null){
			throw new EmptyStackException();
		}
		T item = top.data; //맨위에있는 데이터를 반환하기전에 그다음 데이터를 top으로 옮겨줌
		top = top.next;
		return item;
	}
	
	public void push(T item){//데이터입력
		Node<T> t = new Node<T>(item);
		t.next = top;
		top = t;
	}
	
	public T peek(){//맨위에 있는 데이터를 반환하는 메소드. 단 데이터가 사라지지 않음
		if (top == null){
			throw new EmptyStackException();
		}
		return top.data;
	}
}

public class Test1 {
	public static void main(String[] args){
	Stack<Integer> st = new Stack<Integer>();
	st.push(1);
	st.push(2);
	st.push(3);
	st.push(4);
	System.out.println(st.pop());
	System.out.println(st.pop());
	System.out.println(st.peek());
	System.out.println(st.pop());
	System.out.println(st.peek());
	System.out.println(st.pop());
	System.out.println(st.pop());

	}
}


실행결과

push 직후 ST 스택

 4(top)

 3

 2

 1(bottom)

콘솔창 (마지막으로 실행한 pop의 경우, stack에 데이터가 담겨있지 않아 비어있으므로 exception 처리됨.)

 

2. Queue

- 선형 리스트의 한쪽에서는 삽입만, 다른 한쪽에서는 삭제만 가능하도록 구성한 자료 구조이다.
- FIFO(First In First Out) 방식으로 처리한다. 
- 사용용도

  • 대기행렬 처리에 사용
  • 운영체제의 작업 스케줄링에 사용
두 개의 포인터 존재 : Front(head), Rear(Tail) 
Front(head) :  가장 먼저 삽입된 자료의 기억공간을 가리키는 포인터. 삭제 시 사용
Rear(Tail) : 가장 마지막에 삽입된 자료의 기억공간을 가리키는 포인터. 삽입시 사용

 

package com;

import java.util.NoSuchElementException;

class Queue<T>{//객체를 만들때 데이터타입을 명시하도록 T 로 생성
	
	class Node<T>{//같은 타입을 받는 노드 생성
		private T data;
		private Node<T> next; //다음번 노드
	
		public Node(T data){//생성자를 통해 내부변수에 저장
			this.data = data; 
		}
	}
	
	//queue는 first in first out. 선입선출방식
	
	private Node<T> head; 	//첫번째노드는 제일 먼저 나감
	private Node<T> last;	//마지막노드는 가장 최신 입력 노드
	
	//add : last 데이터 추가
	public void add(T item){
		Node<T> t = new Node<T>(item);
		if(last != null){
			last.next = t; //마지막노드가 있을 경우 다음번 노드에 t를 추가
		}
		last = t; //마지막노드가 없을 경우 입력
		if(head == null){//첫번째 노드가 비었을 경우 당연히 마지막 노드도 데이터 존재하지 않음
			head = last;
		}
	}

	//remove : first 데이터 꺼냄
	public T remove(){
		if(head == null){
			throw new NoSuchElementException();
		}
		T data = head.data;
		head = head.next;
		if (head == null){
			last = null; //첫번째 노드에 데이터가 없을 경우 마지막노드에도 없음
		}
		return data;
	}

	//peek : first 데이터 조회
	public T peek(){
		if(head == null){
			throw new NoSuchElementException();
		}
		return head.data;
	}
}
	
public class Test2 {
	public static void main(String[] args) {
		Queue<Integer> q = new Queue<Integer>();
		q.add(1);
		q.add(2);
		q.add(3);
		q.add(4);
		System.out.println(q.peek());
		System.out.println(q.remove());
		System.out.println(q.remove());
		System.out.println(q.remove());
		System.out.println(q.remove());
	}
}

실행결과

add 직후 queue 

4

(tail)

3

2

1

(head)

콘솔창

 

3. Deque(Double Ended Queue)

- 삽입과 삭제가 리스트의 양쪽 끝에서 모두 발생할 수 있는 자료구조이다. 
- Stack과 Queue의 장점만 구성했다.
- Scroll (입력 제한 데크) : 입력이 한쪽에서만 발생하고 출력은 양쪽에서 일어날 수 있다.
- Shelf (출력 제한 데크) : 입력은 양쪽에서 일어나고 출력은 한쪽에서만 일어날 수 있다.

 

참조 유튜브 영상 : https://www.youtube.com/watch?v=whVUYv0Leg0&list=PLjSkJdbr_gFZL2BNnGLvTgMYXptKGIyum) 

'CS > Data Structure' 카테고리의 다른 글

[자료구조] 알고리즘이란  (0) 2019.11.09
[자료구조] Heap  (0) 2019.02.12
[자료구조] Map, Set  (0) 2019.02.07
[자료구조] Tree, Graph  (0) 2019.02.06
[자료구조] Array List, Linked List  (0) 2019.02.05