다음 작업을 지원하는 스택을 설계한다고 가정합니다.
-
CustomStack(int maxSize) 이것은 스택의 최대 요소 수인 maxSize로 객체를 초기화하거나 스택이 maxSize에 도달하면 아무것도 하지 않습니다.
-
void push(int x) 스택이 maxSize에 도달하지 않은 경우 스택의 맨 위에 x를 삽입합니다.
-
int pop() 스택의 맨 위를 삭제하고 반환하거나 스택이 비어 있으면 -1을 반환합니다.
-
void inc(int k, int val) 이것은 스택의 맨 아래 k 요소를 val만큼 증가시킵니다. 스택에 k개 미만의 요소가 있으면 스택의 모든 요소를 증가시키면 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
두 개의 배열 st 및 inc를 정의하고 하나의 정수 유형 데이터 캡을 생성합니다.
-
이니셜라이저에서 cap :=N을 설정하고 inc :=크기가 N + 10인 새 배열
을 설정합니다. -
push(x) 메서드의 경우 스택의 크기가 cap이 아니면 x를 st에 삽입합니다.
-
pop() 작업은 다음과 같습니다. -
-
st가 비어 있으면 -1을 반환합니다.
-
그렇지 않으면
-
스택의 상단 :=스택의 상단 + inc[스택의 상단 인덱스]
-
스택에 요소가 있으면 inc[size of st - 2]를 inc[size of st – 1]
만큼 증가시킵니다. -
inc[크기 - 1] :=0
-
x :=st의 마지막 요소
-
x를 반환
-
-
inc() 메서드는 다음과 같이 작동합니다 -
-
k를 1만큼 감소
-
k :=k의 최소값과 st의 크기 – 1
-
k <0이면 반환
-
val만큼 증가[k] 증가
예시(C++)
더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h> using namespace std; class CustomStack { public: vector <int> st; vector <int> inc; int cap; CustomStack(int N) { cap = N; inc = vector <int>(N + 10); } void push(int x) { if(st.size() == cap) return; st.push_back(x); } int pop() { if(st.empty()) return -1; else{ st.back() += inc[st.size() - 1]; if(st.size() - 1 > 0 ){ inc[st.size() - 2] += inc[st.size() - 1]; } inc[st.size() - 1] = 0; int x = st.back(); st.pop_back(); return x; } } void increment(int k, int val) { k--; k = min(k, (int)st.size() - 1); if(k < 0) return; inc[k] += val; } }; main(){ CustomStack ob(3); ob.push(1); ob.push(2); cout << ob.pop() << endl; ob.push(2); ob.push(3); ob.push(4); ob.increment(5, 100); ob.increment(2, 100); cout << ob.pop() << endl; cout << ob.pop() << endl; cout << ob.pop() << endl; cout << ob.pop() << endl; }
입력
See the main() in the program
출력
2 103 202 201 -1