스택(Stack)
LIFO구조(후입선출) : 마지막에 들어온 데이터가 먼저 나가는 구조
(Last In First Out)
* 주 연산
- pop(값)
- pop()
- peek() : 스택의 가장 마지막으로 들어온 값 반환
- contains(값) : 스택 안 값의 존재 유무(있으면 true, 없으면 false 반환)
- empty() : 비어있는지 유무(비어있으면 true, 하나라도 있다면 false 반환)
- clear() : 모두 삭제
실습 코드
// 선형 자료구조 - 스택
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Stack stack = new Stack();
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
stack.push(5);
System.out.println(stack);
System.out.println(stack.pop());
System.out.println(stack);
System.out.println(stack.pop());
System.out.println(stack);
System.out.println(stack.peek());
System.out.println(stack);
System.out.println(stack.contains(1));
System.out.println(stack.size());
// 비어있는지 유무. 비어있으면 true, 하나라도 있으면 false
System.out.println(stack.empty());
// 스택 안의 데이터 모두 삭제
stack.clear();
System.out.println(stack);
}
}
ArrayList를 이용한 스택 구현
// Practice1
// ArrayList 를 이용한 스택 구현
import java.util.ArrayList;
class MyStack1 {
ArrayList list; // list 변수
// 위 객체를 생성할 때 기본 생성자 MyStack1이 자동으로 호출되면서
// list에 ArrayList가 할당되고 있는 상황
MyStack1() {
this.list = new ArrayList();
}
public boolean isEmpty() {
if(this.list.size() == 0) {
return true;
} else {
return false;
}
}
public void push(int data) {
this.list.add(data);
}
// 데이터가 더이상 없을 때는 pop되지 않도록 예외 기능 역시 구현하기
public Integer pop() {
if(this.isEmpty()) {
System.out.println("Stack is empty!");
return null;
}
// list의 최대사이즈 -1 부분을 인덱스로 해서 get을 하면
// list의 가장 끝을 가져올 수 있음
// * 제너릭(Generic): 데이터 타입을 일반화한다는 것을 의미
// 오류 원인: ArrayList가 제너릭하게 되어있지 않아서 형변환을 한번 해줘야 함
// int data = this.list.get(this.list.size() - 1);
// pop으로 돌려줄 데이터
int data = (int)this.list.get(this.list.size() - 1);
// pop을 시키면 스택 자료구조에서 해당 데이터를 제거해주어야 함.
this.list.remove(this.list.size() - 1);
return data;
}
public Integer peek() {
if(this.isEmpty()) {
System.out.println("Stack is empty!");
return null;
}
int data = (int)this.list.get(this.list.size() - 1);
return data;
}
public void printStack() {
System.out.println(this.list);
}
}
public class Practice1 {
public static void main(String[] args) {
// Test code
MyStack1 myStack = new MyStack1();
System.out.println(myStack.isEmpty());
myStack.isEmpty();
myStack.push(1);
myStack.push(2);
myStack.push(3);
myStack.push(4);
myStack.push(5);
myStack.printStack(); // 1, 2, 3, 4, 5
System.out.println(myStack.peek()); // 5
myStack.printStack(); // 1, 2, 3, 4, 5
System.out.println(myStack.pop()); // 5
System.out.println(myStack.pop()); // 4
myStack.printStack(); // 1, 2, 3
System.out.println(myStack.pop()); // 3
System.out.println(myStack.pop()); // 2
System.out.println(myStack.pop()); // 1
myStack.printStack();
}
}
배열을 이용한 기본 스택 직접 구현
// Practice2
// 배열을 이용한 기본 스택 직접 구현
class MyStack2 {
int[] arr;
int top = -1; // 아무것도 없다는 뜻
MyStack2(int size) {
arr = new int[size];
}
public boolean isEmpty() {
if (this.top == -1) {
return true; // 비어있으면 true
} else {
return false; // 하나라도 있다면 false
}
}
// ArrayList와 다르게 사이즈가 고정되어 있다는 점
public boolean isFull() {
if (this.top == this.arr.length - 1) { // 마지막까지 데이터가 들어있는 것
return true;
} else {
return false;
}
}
public void push(int data) {
if (this.isFull()) { // 스택의 공간의 꽉 찼는지 부터 체크
System.out.println("Stack is full!");
return;
}
this.top += 1; // 꽉 안찼으면 top에 1을 증가시켜줌
this.arr[this.top] = data; // top 위치에 데이터 할당
}
public Integer pop() {
if (this.isEmpty()) {
System.out.println("Stack is empty!");
return null;
}
int data = this.arr[this.top]; // 가장 마지막에 들어온 데이터 위치
this.top -= 1;
return data;
}
public Integer peek() {
if (this.isEmpty()) {
System.out.println("Stack is empty!");
return null;
}
return this.arr[this.top];
}
public void printStack() {
for (int i = 0; i < this.top + 1; i++) {
System.out.print(this.arr[i] + " ");
}
System.out.println();
}
}
public class Practice2 {
public static void main(String[] args) {
// Test code
MyStack2 myStack = new MyStack2(5);
System.out.println(myStack.isEmpty());
myStack.push(1);
myStack.push(2);
myStack.push(3);
myStack.push(4);
myStack.push(5);
myStack.push(6);
myStack.printStack(); // 1, 2, 3, 4, 5
System.out.println(myStack.peek()); // 5
myStack.printStack(); // 1, 2, 3, 4, 5
System.out.println(myStack.pop()); // 5
System.out.println(myStack.pop()); // 4
myStack.printStack(); // 1, 2, 3
System.out.println(myStack.pop()); // 3
System.out.println(myStack.pop()); // 2
System.out.println(myStack.pop()); // 1
myStack.printStack();
}
}
'자료구조 l 알고리즘 > Ch. 02. 선형 자료구조' 카테고리의 다른 글
| 해시 테이블_1 (0) | 2023.03.19 |
|---|---|
| 데크(Deque) (0) | 2023.03.18 |
| 큐(Queue) (0) | 2023.03.17 |
| 연결리스트 (0) | 2023.03.17 |
| 배열 (0) | 2023.03.17 |