반응형
스택은 기본 원칙이 '후입선출(LIFO : Last in First out)' 이다.
말 그대로 '나중에 들어온 것이 먼저 들어오는 방식'이다.
- 먼저 들어온 것은 가장 아래에 있고, 가장 아래에 있는만큼 가장 나중에 빠져나오게 된다.
- 그리고 데이터를 추가하는 작업을 push 라고 한다.
- 또한 데이터를 삭제하는 작업을 pop 이라고 한다.
이를 토대로 메서드를 구현하였다.
1
2
3
4
5
|
public class Stack10828 {
private static int[] arr; //스택을 담는 배열
private static int str=0; //스택포인터
}
|
cs |
str은 스택 포인터로 스택에 쌓여있는 데이터의 수를 나타낼 것이다. 시작값 = 0
배열 arr은 배열을 저장하는 스택 본체의 배열이다.
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
|
public static void push(int x){ //push 메서드
arr[str++]= x;
}
public static int pop(){
if (str<=0){
return -1;
}
return arr[--str];
}
public static int size(){
return str;
}
public static int empty() {
if(str == 0) {
return 1;
}
else {
return 0;
}
}
public static int top(){
if (str<=0){
return -1;
}
return arr[str-1];
}
|
cs |
push: 전달받은 테이더값x를 배열 arr에 저장해준다 위치는 str로 정하며 저장후에는 다음 위치로 str을 옮겨줘야하기 떄문에 arr[str++]을 이용하였다.
pop: 데이터를 제거한 후 제거한 수를 반환해줘야한다. 만약 저장되어있는 수가 없다면 -1을 반환해준다. 또한 str의 위치를 하나 전으로 가야하기 때문에 arr[--str]을 이용해준다.
size: 택에 들어있는 정수의 개수를 출력한다. str을 반환해주면 되겠다.
empty: 스택이 비워져있는지 확인하는 메서드다. str이 0이면 1 이외에는 0을 반환하도록 작성했다.
top: 스택에 맨 위에 있는 요소를 반환하는 메서드. 현재 str은 빈공간의 배열을 가르키고 있기때문에 arr[str-1]로 확인해준다. pop과 달리이후의 값이 달라지지 않기 떄문에 str의 위치는 그대로 둔다.
1 . Scanner + StringBuilder를 사용하여 문제를 풀었다.
StringBuilder는 초보개발자인 나는 처음 이용해봤다. 다음 글을 StringBuilder에 대하여 정리해야겠다.
(StringBuilder는 문자열을 더할 떄 새로운 객체를 생성해서 더하는게 아니라 기존의 데이터에 더하는 방식이기 때문에 그냥 String 객체끼리 더할때에 비해 성능이 좋다.)
append()는 문자열을 더하는 역할을 한다.
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
32
33
34
35
36
37
38
|
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
int N = sc.nextInt();
arr = new int[N];
for (int i = 0; i<N; i++){
String m = sc.next();
switch (m){
case "push" :
push(sc.nextInt());
break;
case "pop" : //StringBuilder에는 append()가 있으며, 이는 문자열을 더하는 역할을 한다.
sb.append(pop()).append('\n');
break;
case "size" :
sb.append(size()).append('\n');
break;
case "empty" :
sb.append(empty()).append('\n');
break;
case "top" :
sb.append(top()).append('\n');
break;
}
}
System.out.println(sb);
sc.close();
}
|
cs |
결과
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
import java.util.Scanner;
public class Main{
private static int[] arr;
private static int str=0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
int N = sc.nextInt();
arr = new int[N];
for (int i = 0; i<N; i++){
String m = sc.next();
switch (m){
case "push" :
push(sc.nextInt());
break;
case "pop" : //StringBuilder에는 append()가 있으며, 이는 문자열을 더하는 역할을 한다.
sb.append(pop()).append('\n');
break;
case "size" :
sb.append(size()).append('\n');
break;
case "empty" :
sb.append(empty()).append('\n');
break;
case "top" :
sb.append(top()).append('\n');
break;
}
}
System.out.println(sb);
sc.close();
}
public static void push(int x){ //push 메서드
arr[str++]= x;
}
public static int pop(){
if (str<=0){
return -1;
}
return arr[--str];
}
public static int size(){
return str;
}
public static int empty() {
if(str == 0) {
return 1;
}
else {
return 0;
}
}
public static int top(){
if (str<=0){
return -1;
}
return arr[str-1];
}
}
|
cs |
반응형
'알고리즘 > 백준(BAEKJOON)' 카테고리의 다른 글
[자바]1181 단어 정렬[백준] (0) | 2022.01.06 |
---|---|
[백준]10773번 제로 [JAVA] (0) | 2021.12.07 |
[JAVA] 백준 2750 수 정렬하기 (0) | 2021.10.12 |
백준 1차원배열/4344 자바/평균은 넘겠지 (0) | 2021.09.29 |
[1152 자바] 단어의 개수/백준 (0) | 2021.09.24 |