สมมติว่าเราต้องการออกแบบสแต็กที่รองรับการทำงานต่อไปนี้
-
CustomStack(int maxSize) สิ่งนี้เริ่มต้นวัตถุด้วย maxSize ซึ่งเป็นจำนวนสูงสุดขององค์ประกอบในสแต็ก หรือไม่ทำอะไรเลยหากสแต็กถึงขนาดสูงสุด
-
ถือเป็นโมฆะ push(int x) สิ่งนี้จะแทรก x ไปที่ด้านบนของสแต็กหากสแต็กยังไม่ถึงขนาดสูงสุด
-
int pop() การดำเนินการนี้จะลบและส่งคืนส่วนบนสุดของสแต็กหรือ -1 หากสแต็กว่างเปล่า
-
void inc(int k, int val) สิ่งนี้จะเพิ่มองค์ประกอบ k ด้านล่างของสแต็กโดย val หากมีองค์ประกอบน้อยกว่า k รายการในสแต็ก ให้เพิ่มองค์ประกอบทั้งหมดในสแต็ก
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดอาร์เรย์สองอาร์เรย์ st และ inc และสร้างแคปข้อมูลประเภทจำนวนเต็มหนึ่งค่า
-
ใน initializer ให้ set cap :=N และ set inc :=a new array of size N + 10
-
สำหรับเมธอด push(x) หากขนาดของสแต็กไม่ใช่ cap ให้ใส่ x ลงใน st.
-
การดำเนินการ pop() จะเป็นเช่น −
-
หาก st ว่างเปล่า ให้คืนค่า -1
-
อย่างอื่น
-
ด้านบนของสแต็ก :=ด้านบนของสแต็ก + inc[ดัชนีบนสุดของสแต็ก]
-
หาก stack มีองค์ประกอบอยู่บ้าง ให้เพิ่ม inc[size of st - 2] โดย inc[size of st – 1]
-
inc[ขนาดของ s - 1] :=0
-
x :=องค์ประกอบสุดท้ายของ st
-
ผลตอบแทน x
-
-
inc() วิธีการจะทำงานดังนี้ −
-
ลด k ลง 1
-
k :=นาทีของ k และขนาดของ st – 1
-
ถ้า k <0 แล้วกลับ
-
เพิ่ม inc[k] โดย val.
ตัวอย่าง (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