달력

52025  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

◆◆ Stack 과 Queue


◆ 1. Stack

  ㉠ 정의

      여러 개의 데이타 항목들이 일정한 순서로 나열된 자료 구조로, 한쪽 끝에서만 새로운 항목을 삽입하거나 기존 항목을 삭제할 수
      있는 선형 구조.


  ㉡ 특징

      Last- In-First-Out List (후입 선출) : 먼저 삽입된 것은 나중에 삭제되고, 나중에 삽입된 것이 먼저 삭제.

      push : Data 를 넣는 것.

      pop : 넣어둔 Data 를 꺼내는 것.

      top : Data 를 저장하는 위치


  ㉢ 연산

       S를 스택, x를 데이터 요소(element)라고 하자. 그러면 스택에서는 아래와 같은 중요한 연산이 존재하는 것을 알 수 있다.

       S.top(): 스택의 가장 윗 데이터를 넘겨준다.만약에 비었다면 이 연산은 정의불가 상태다.

       S.pop(): 스택의 가장 윗 데이터를 지우고 그 값을 넘겨준다.스택이 비었다면 연산 정의불가 상태.

       S.push(): 스택의 가장 윗 데이터로 x를 넣는다.

       S.empty(): 스택이 비었다면 참을 주고,그렇지 않다면 거짓이 된다.

       또한, 스택연산을 목록(list) 연산으로 표현할 수도 있다.

       S.top(): S.retrieve(S.first())

       S.pop(): S.top(),S.delete(S.first())

       S.push():S.insert(x,pNull)

       S.empty():S.first()==pNull

 

◆ 2. Queue

  ㉠ 정의

      여러 개의 데이타 항목들이 일정한 순서로 나열된 자료 구조로 한쪽 끝에서는 삽입만 할 수 있고, 삭제는 반대쪽 끝에서만 할 수 있
      도록 되어 있는 선형 구조.


  ㉡ 특징

       First In First Out (선입선출) : 큐에 저장된 데이터 항목들 중에 먼저 삽입된 것은 먼저 삭제되고, 나중에 삽입된 것은 나중에 삭제.

       put : Data 를 넣는 것.

       get : Data 를 꺼내는 것.

       front(head) : Data 를 put 할 수 있는 위치.

       rear(tail) : Data 가 있어 get 할 수 있는 위치.

       Overflow : Queue 가 꽉 차서 더 이상 Data 를 넣을 수 없는 경우 (put 할 수 없는 경우)

       Underflow : Queue 가 비어 있어 Data 를 꺼낼 수 없는 경우 (get 할 수 없는 경우)


  ㉢ 종류

       가. 선형 Queue : 막대 모양으로 된 Queue 이다. 크기가 제한되어 있고 빈 공간을 사용하려면 모든 Data 를 꺼내거나 Data 를 한
                               칸씩 옮겨야 한다는 단점이 있다.

       나. 환형 Queue  : 선형 Queue 의 문제점을 보완한 것이 환형 Queue 이다. front가 Queue 의 끝에 닿으면 Queue 의 맨 앞으로 Data 를 보내어 원형으로 연결 하는 방식.

       다. Linked Queue  : Linkedlist 를 사용한 것으로써, Queue  의 길이를 쉽게 늘릴 수 있어 Overflow 가 발생하지 않는다.

                                  필요에 따라 환형으로 만들 수도 있으며, 환형으로 만들지 않아도 삽입과 삭제가 제한되지 않아 편리하다.

 

◆◆ 3. Simulation (Java)


1. node 클레스 설계
------------------------------------------------------------------------------------------------------------------
public class Node {
 
 public Node(int v){
  value = v;
 }
 
 public int value;
 public Node next;   // 자기 참조!!
}
------------------------------------------------------------------------------------------------------------------

 

2. LinkedList 클레스 설계
------------------------------------------------------------------------------------------------------------------
public class LinkedList {
 Node header;

 public LinkedList(Node h) {
  header = h;
 }

 public void append(Node node) {
  Node last = header;
  while (last.next != null) {
   last = last.next;
  }
  last.next = node;
 }
 
 public Node getHeader(){
  return header;
 }

 public void remove_back() //링크드 리스트에 뒤에 있는걸 삭제
 {
  Node last = header;

  if (last.next == null)  // elements 가 하나만 있는 상황이므로 끊을필요 없다
  {
  }
  else
  {
   while (last.next.next != null) { // 두번째 연결된 elements 의 next 값이 없을때 까지 루프
    last = last.next;
   }
   last.next = null; //  마지막 에 연결된 elements 의 next 를 null 값을 넣어 끊기
  }
 }
 
 public void remove_front() //링크드 리스트에 앞에 있는걸 삭제
 {
  header = header.next; // 헤더 를 다음 값으로 바꾸기
  
 }
  
}
------------------------------------------------------------------------------------------------------------------

 

3. Array 로 Stack 구현
------------------------------------------------------------------------------------------------------------------
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class IntStack_A {
 
    private int[] data;

    private int top;   // stack 맨위

    private int many_items; // 현재 Stack 에 몇 개의 원소가 있는지를 저장해 놓은 변수

    private int stack_size; // Stack 의 전체 크기
   
    private BufferedReader br ;

public IntStack_A(int size) // size : 스텍의 크기
    {
        data = new int[size];

        stack_size = size;      

        top = -1; // stack 이 비어 있을 때

        many_items = 0;

     System.out.println("값을 입력하세요 :");
     try {
      br = new BufferedReader(new InputStreamReader(System.in));
      push(Integer.parseInt(br.readLine()));
      br = new BufferedReader(new InputStreamReader(System.in));
      push(Integer.parseInt(br.readLine()));
      br = new BufferedReader(new InputStreamReader(System.in));
      push(Integer.parseInt(br.readLine()));
      br = new BufferedReader(new InputStreamReader(System.in));
      push(Integer.parseInt(br.readLine()));

   printf1();   
   System.out.println("");
   System.out.println("1.삭제(POP)  2.삽입(PUSH)");
   br = new BufferedReader(new InputStreamReader(System.in));
   String sd=br.readLine();
   if (sd.equals("1"))
   {
   pop();
   printf1();
   }
   
   else if (sd.equals("2"))
   {
   push(99);
   printf1();
   } 
   
  } catch (NumberFormatException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
       
    }
   
   
    public void push(int number) // push()는 Stack 의 맨 위에 쌓아놓을 수 있다  >> data 배열에 숫자를 넣음
    {
        data[++top] = number; //++top 연산을 통해서 top 은 push 함수를 호출할 때마다 하나씩 위로 올라가서 Stack 의 맨 위를 언제나 가리키게 됨
                                         // 배열 이므로 제일 나중에 집어넣은 원소의 Index 를 보유

        many_items++; // Stack 에 저장된 원소의 갯수 1 증가
    }

   
    public int pop() // 맨 위에서만 빼낼 수 있다
 {
  many_items--; // Stack 에 저장된 원소의 갯수 1 감소
  return data[top--]; // 배열에서 맨위의 값을 반환하고 인덱스 를 1 감소시킴
 }
   
   

    public void printf1() // 배열 출력
    {
     for(int i=0;i<many_items;i++){
     System.out.print(data[i]+",");
  }
    }

     public static void main(String[] args)
     {
 new IntStack_A(5);
      }
}

------------------------------------------------------------------------------------------------------------------

 

4. Array 로 Queue 구현
------------------------------------------------------------------------------------------------------------------
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class IntQueue_A {
 
    private int[] data;

    private int rear;   // Queue 맨위

    private int many_items; // 현재 Queue 에 몇 개의 원소가 있는지를 저장해 놓은 변수

    private int Queue_size; // Queue 의 전체 크기
   
    private BufferedReader br ;

public IntQueue_A(int size) // size : Queue 크기
    {
        data = new int[size];

        Queue_size = size;      

        rear = -1; // Queue 가 비어 있을 때

        many_items = 0;

     System.out.println("값을 입력하세요 :");
     try {
      br = new BufferedReader(new InputStreamReader(System.in));
      push(Integer.parseInt(br.readLine()));
      br = new BufferedReader(new InputStreamReader(System.in));
      push(Integer.parseInt(br.readLine()));
      br = new BufferedReader(new InputStreamReader(System.in));
      push(Integer.parseInt(br.readLine()));
      br = new BufferedReader(new InputStreamReader(System.in));
      push(Integer.parseInt(br.readLine()));

   printf1();   
   System.out.println("");
   System.out.println("1.삭제(POP)  2.삽입(PUSH)");
   br = new BufferedReader(new InputStreamReader(System.in));
   String sd=br.readLine();
   if (sd.equals("1"))
   {
   pop();
   printf1();
   }
   
   else if (sd.equals("2"))
   {
   push(99);
   printf1();
   }  
   
  } catch (NumberFormatException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }       
    }
       
    public void push(int number) //  data 배열에 숫자를 넣음
    {
        data[++rear] = number; //

        many_items++; // Queue 에 저장된 원소의 갯수 1 증가
    }
   
    public void pop() // 맨 위에서만 빼낼 수 있다
 {

  for (int i=0;i<many_items;i++)
  {
   data[i] = data[i+1];
  }

  many_items--; // Queue 에 저장된 원소의 갯수 1 감소
 }

    public void printf1() // 배열 출력
    {
     for(int i=0;i<many_items;i++){
     System.out.print(data[i]+",");
  }
    }

 public static void main(String[] args) {
  new IntQueue_A(5);
 }
}
------------------------------------------------------------------------------------------------------------------

 

5. LinkedList 로 Stack 구현
------------------------------------------------------------------------------------------------------------------
public class LinkedListStack {
 public static void main(String[] args) {
  LinkedList list = new LinkedList(new Node(50));
  list.append(new Node(20));
  list.append(new Node(30));
  print(list.getHeader());
  list.remove_back();
  print(list.getHeader());
  list.append(new Node(10));
  print(list.getHeader());
  list.append(new Node(60));
  print(list.getHeader());
  list.remove_back();
  print(list.getHeader());
  list.remove_back();
 }

 private static void print(Node header) {
  Node list = header;
  while (list != null) {
   System.out.print(list.value + " -> ");
   list = list.next;
  }
  System.out.println();
 }
}
------------------------------------------------------------------------------------------------------------------

 

6. LinkedList 로 Queue 구현
------------------------------------------------------------------------------------------------------------------
public class LinkedListQueue {
 public static void main(String[] args) {
  LinkedList list = new LinkedList(new Node(50));
  list.append(new Node(20));
  list.append(new Node(30));
  print(list.getHeader());
  list.append(new Node(10));
  print(list.getHeader());
  list.append(new Node(60));
  print(list.getHeader());
  list.remove_front();
  print(list.getHeader());
 }

 private static void print(Node header) {
  Node list = header;
  while (list != null) {
   System.out.print(list.value + " -> ");
   list = list.next;
  }
  System.out.println();
 }
}

'자료구조' 카테고리의 다른 글

자료구조(해싱)  (0) 2009.11.06
자료구조 ( Array와 Linked List)-  (0) 2009.11.06
Posted by 인천총각
|