1에서 n까지의 고유한 요소의 배열 번호가 있다고 가정합니다. 스택 정렬 가능 여부를 확인해야 합니다. 배열은 임시 스택을 사용하여 다른 배열에 저장할 수 있을 때 스택 정렬이 가능합니다.
이 문제를 해결하기 위해 배열에서 다음 작업 중 하나를 사용할 수 있습니다. −
-
배열의 시작 요소를 삭제하고 해당 항목을 스택에 푸시합니다.
-
스택의 맨 위 요소를 삭제하고 두 번째 배열의 끝에 삽입합니다.
이제 주어진 배열의 모든 요소가 이러한 작업에 의해 두 번째 배열로 전송되어 두 번째 배열이 내림차순으로 정렬되지 않으면 주어진 배열은 스택 정렬이 가능합니다.
따라서 입력이 nums =[8, 6, 5, 3, 1]과 같으면 시계 방향으로 두 번 회전할 수 있으므로 출력은 True가 됩니다. 그러면 [1, 3, 4, 5, 6, 8]
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- 하나의 스택 stk 정의
- 마지막 :=0
- 초기화 i의 경우:=0, i
- stk가 비어 있지 않으면 -
- top :=stk의 최상위 요소
- top이 (last + 1)과 같을 때 −
- 마지막 :=마지막 + 1
- stk에서 팝
- stk가 비어 있으면:
- 루프에서 빠져나오기
- top :=stk의 최상위 요소
- stk가 비어 있으면:
- v[i]를 stk로 푸시
- 그렇지 않으면
- top :=stk의 최상위 요소
- v[i] <상단이면:
- v[i]를 stk로 푸시
- 그렇지 않으면
- 거짓 반환
- 그렇지 않으면
- v[i]를 stk로 푸시
- stk가 비어 있지 않으면 -
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h>
using namespace std;
bool solve(vector<int> &v) {
stack<int> stk;
int last = 0;
for (int i = 0; i < v.size(); i++) {
if (!stk.empty()){
int top = stk.top();
while (top == last + 1) {
last = last + 1;
stk.pop();
if (stk.empty()){
break;
} top = stk.top();
}
if (stk.empty()) {
stk.push(v[i]);
}else{
top = stk.top();
if (v[i] < top){
stk.push(v[i]);
}else{
return false;
}
}
}else{
stk.push(v[i]);
}
} return true;
}
main(){
vector<int>
v = {8, 6, 5, 3, 1};
cout << solve(v);
} 입력
{8, 6, 5, 3, 1} 출력
1