
프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 Load되어야 함
또한, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요
따라서, 컴퓨터 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공
프로그램이 운영체제로부터 할당받는 대표적인 메모리공간에는코드(code)영역데이터(data)영역스택(stack)영역힙(heap)영역이 있음

코드(Code) 영역
데이터(Data) 영역
힙(Heap) 영역
스택(Stack) 영역
메모리 영역을 4가지로 나누는 이유는 우리가 어떠한 프로그램을 구현할 때 각각의 변수, 함수, 클래스 등이 호출되고 해제되는 시기가 다르기 때문!
만약에 어떠한 함수 내에서 한 번 사용되는 변수가 프로그램 처음부터 끝까지 메모리에 남아있게 된다면? == 메모리 낭비
어떠한 함수 내에서 값을 변경하고 함수가 끝나더라도 그 값을 유지했으면 좋겠는데 함수 종료와 동시에 그 값이 메모리에서 사라진다면?
이것을 방지하기 위해 메모리 구조를 나눔


스택(stack)이란 쌓아 올린다는 것을 의미
후입선출(LIFO, Last In First Out) 방식의 자료구조
push, 삭제하는 연산을 pop이라고 함stack underflow라고하며 스택이 넘치는 경우 stack overflow라고 함스택이 넘친다는게 무슨 말일까?
스택은 크기를 고정해서 사용하기 때문에 고정된 크기의 스택에 데이터를 계속 넣어서 넘치면 다른 메모리 영역을 침범하게 된다. 이것이StackOverFlow
스택으로 큐를 구현하기 위해서는 2개의 스택 필요

A 스택이 input, B 스택이 output이라고 생각하면 됨
A 스택에 push하고 B 스택에 pop 하게 되면 선입선출 구조로 사용 가능


Queue의 사전적인 의미는 (무엇을 기다리는 사람, 자동차 등의) 줄, 혹은 줄을 서서 기다리는 것
선입선출(FIFO, First In First Out) 방식의 자료구조
지정된 곳을 통해서 삽입, 삭제하는 스택과는 다르게 큐는 한쪽 끝에서 삽입 작업이, 다른 쪽 끝에서 삭제 작업이 양쪽으로 이루어짐
이때 삭제연산만 수행되는 곳을 프론트(front), 삽입연산만 수행되는 곳을 리어(rear)라고 정하여 각각의 연산작업만 수행
이때, 큐의 리어(rear)에서 이루어지는 삽입연산을 인큐(enQueue), 프론트에서 이루어지는 삭제연산을 디큐(dnQueue)라고 부름
큐의 가장 첫 원소를 front, 가장 끝 원소를 rear라고 함
큐는 들어올때 rear로 들어오지만 나올때는 front부터 빠지는 특성을 가짐
접근 방법은 첫 원소와 끝 원소로만 가능
가장 먼저 들어온 프론트 원소가 가장 먼저 삭제(FIFO방식)
즉, 큐에서 프론트 원소는 가장 먼저 큐에 들어왔던 첫번째 원소가 되고 리어 원소는 가장 늦게 큐에 들어온 마지막 원소가 된다.

제일 마지막으로 PUSH한 3이 제일 아래에 가도록 1,2를 POP하고 다시 순서대로 PUSH 해줌
이렇게 되면 가장 나중에 들어온 값이 큐의 첫번 째 자리에 위치
top()이나 pop() 메소드를 호출할 때 큐의 첫번째 값을 참조하면 된다