กองเข้า C++ STL พร้อมตัวอย่าง
std::stack คืออะไร?
สแต็กคือโครงสร้างข้อมูลที่ทำงานบนเทคนิค LIFO (Last In First Out) std::stack อนุญาตให้เพิ่มและลบองค์ประกอบได้จากด้านใดด้านหนึ่งเท่านั้น
ชั้น std::stack เป็นอะแดปเตอร์คอนเทนเนอร์ ออบเจ็กต์คอนเทนเนอร์เก็บข้อมูลประเภทข้อมูลที่คล้ายกัน คุณสามารถสร้างสแต็กจากคอนเทนเนอร์ลำดับต่างๆ ได้ หากไม่มีการระบุคอนเทนเนอร์ คอนเทนเนอร์ deque จะถูกใช้เป็นค่าเริ่มต้น อะแดปเตอร์คอนเทนเนอร์ไม่รองรับตัววนซ้ำ ดังนั้นจึงใช้จัดการข้อมูลไม่ได้
สแต็กไวยากรณ์
ในการสร้าง stack เราต้องรวม ไฟล์ส่วนหัวในโค้ดของเรา จากนั้นเราใช้ไวยากรณ์นี้เพื่อกำหนด std::stack:
template <class Type, class Container = deque<Type> > class stack;
- ประเภท – เป็นประเภทขององค์ประกอบที่มีอยู่ใน std::stack มันอาจจะถูกต้องก็ได้ C++ หรือแม้กระทั่งประเภทที่ผู้ใช้กำหนด
- ภาชนะ – เป็นประเภทของวัตถุคอนเทนเนอร์ต้นแบบ
ประเภทสมาชิก
ต่อไปนี้เป็นประเภทสมาชิกสแต็ก:
- value_type- พารามิเตอร์เทมเพลตแรก T ซึ่งแสดงถึงประเภทองค์ประกอบ
- container_type- พารามิเตอร์เทมเพลตที่สอง คอนเทนเนอร์ มันหมายถึงประเภทคอนเทนเนอร์พื้นฐาน
- size_type- ประเภทอินทิกรัลที่ไม่ได้ลงนาม
Operaต่างๆ ใน Stack
A C++ สแต็กรองรับการดำเนินการพื้นฐานต่อไปนี้:
- ดัน - เพิ่ม/ดันรายการลงในสแต็ก
- ป๊อป - ลบ / ป๊อปรายการออกจากสแต็ก
- peek – ส่งคืนไอเท็มบนสุดของสแต็กโดยไม่ต้องลบออก
- isFull – ตรวจสอบว่าสแต็กเต็มหรือไม่
- isEmpty – ตรวจสอบว่าสแต็กว่างเปล่าหรือไม่
การใช้งานสแต็ก
ขั้นตอน 1) ในตอนแรกเรามีสแต็คว่าง ด้านบนของสแต็กว่างถูกตั้งค่าเป็น -1
ขั้นตอน 2) ต่อไป เราได้ผลักองค์ประกอบ 5 เข้าไปในสแต็ก ด้านบนของสแต็กจะชี้ไปที่องค์ประกอบ 5
ขั้นตอน 3) ขั้นต่อไป เราได้ผลักองค์ประกอบ 50 เข้าไปในสแต็ก ส่วนบนของสแต็กจะเลื่อนและชี้ไปที่องค์ประกอบ 50
ขั้นตอน 4) จากนั้นเราได้ดำเนินการป๊อปเอาองค์ประกอบบนสุดออกจากสแต็ก องค์ประกอบ 50 จะถูกป๊อปออกจากสแต็ก ส่วนบนสุดของสแต็กจะชี้ไปที่องค์ประกอบ 5
กด() และป๊อป()
ฟังก์ชัน stack::push() จะเพิ่มรายการใหม่ที่ด้านบนของสแต็ก ขนาดสแต็กจะเพิ่มขึ้น 1 หลังจากการแทรก ฟังก์ชันใช้ไวยากรณ์นี้:
stack.push(value)
ค่าคือรายการที่จะแทรกลงในสแต็ก
ฟังก์ชัน stack:: pop() จะลบองค์ประกอบด้านบนของสแต็ก นี่คือรายการใหม่ล่าสุดของสแต็ก ขนาดปึกจะลดลง 1 หลังจากการถอดออก นี่คือไวยากรณ์ของฟังก์ชัน:
stack.pop()
ฟังก์ชันไม่รับพารามิเตอร์
1 ตัวอย่าง:
#include <iostream> #include <stack> using namespace std; int main() { stack<int> st; st.push(10); st.push(20); st.push(30); st.push(40); st.pop(); st.pop(); while (!st.empty()) { cout << ' ' << st.top(); st.pop(); } }
Output:
นี่คือภาพหน้าจอของรหัส:
คำอธิบายรหัส:
- รวมไฟล์ส่วนหัว iostream ไว้ในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัวของสแต็กในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมเนมสเปซมาตรฐานไว้ในโค้ดของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
- เรียกใช้ฟังก์ชัน main() ควรเพิ่มตรรกะของโปรแกรมภายในฟังก์ชันนี้
- สร้าง stack st เพื่อเก็บค่าจำนวนเต็ม
- ใช้ฟังก์ชัน push() เพื่อแทรกค่า 10 ลงในสแต็ก
- ใช้ฟังก์ชัน push() เพื่อแทรกค่า 20 ลงในสแต็ก
- ใช้ฟังก์ชัน push() เพื่อแทรกค่า 30 ลงในสแต็ก
- ใช้ฟังก์ชัน push() เพื่อแทรกค่า 40 ลงในสแต็ก
- ใช้ฟังก์ชัน pop() เพื่อลบองค์ประกอบด้านบนออกจากสแต็ก ซึ่งก็คือ 40 องค์ประกอบด้านบนตอนนี้กลายเป็น 30
- ใช้ฟังก์ชัน pop() เพื่อลบองค์ประกอบด้านบนออกจากสแต็ก ซึ่งก็คือ 30 องค์ประกอบด้านบนตอนนี้กลายเป็น 20
- ใช้ลูป while และฟังก์ชัน empty() เพื่อตรวจสอบว่าสแต็กไม่ว่างหรือไม่ ! คือตัวดำเนินการ NOT
- การพิมพ์เนื้อหาปัจจุบันของสแต็กบนคอนโซล
- เรียกใช้ฟังก์ชัน pop() บนสแต็ก
- ส่วนท้ายของส่วน while ของ loop
- จุดสิ้นสุดของเนื้อหาฟังก์ชัน main()
ว่างเปล่า() ขนาด() ด้านบน()
สแต็คมีฟังก์ชันในตัวที่คุณสามารถใช้เพื่อเล่นกับสแต็กและค่าต่างๆ ของมัน ซึ่งรวมถึง:
- Empty()- เช็คว่า Stack ว่างหรือไม่
- size()- ส่งกลับขนาดของสแต็ก ซึ่งก็คือจำนวนองค์ประกอบในสแต็ก
- top()- เข้าถึงองค์ประกอบสแต็กที่ด้านบน
2 ตัวอย่าง:
#include <iostream> #include <stack> using namespace std; void createStack(stack <int> mystack) { stack <int> ms = mystack; while (!ms.empty()) { cout << '\t' << ms.top(); ms.pop(); } cout << '\n'; } int main() { stack <int> st; st.push(32); st.push(21); st.push(39); st.push(89); st.push(25); cout << "The stack st is: "; createStack(st); cout << "\n st.size() : " << st.size(); cout << "\n st.top() : " << st.top(); cout << "\n st.pop() : "; st.pop(); createStack(st); return 0; }
Output:
นี่คือภาพหน้าจอของรหัส:
คำอธิบายรหัส:
- รวมไฟล์ส่วนหัว iostream ไว้ในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัวของสแต็กในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมเนมสเปซมาตรฐานไว้ในโปรแกรมของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
- สร้างฟังก์ชัน createStack ที่เราสามารถใช้สร้าง stack mystack ได้ สแต็กจะเก็บชุดของจำนวนเต็ม
- จุดเริ่มต้นของเนื้อความของฟังก์ชัน createStack
- สร้างอินสแตนซ์ของประเภทข้อมูล mystack และตั้งชื่อให้ว่า ms
- ใช้ฟังก์ชัน while loop และฟังก์ชัน Empty() เพื่อตรวจสอบว่าสแต็กว่างเปล่าหรือไม่
- จุดเริ่มต้นของส่วนเนื้อหาของ while loop
- ใช้ฟังก์ชัน top() เก็บไว้ที่ด้านบนของสแต็ก อักขระ \t จะสร้างแท็บใหม่
- ใช้ฟังก์ชัน pop() เพื่อลบองค์ประกอบที่ด้านบนของสแต็ก
- ส่วนท้ายของส่วน while ของ loop
- พิมพ์บรรทัดว่างบนคอนโซล
- ส่วนท้ายของฟังก์ชัน createStack
- เรียกใช้ฟังก์ชัน main() ควรเพิ่มตรรกะของโปรแกรมภายในเนื้อหาของฟังก์ชัน main()
- จุดเริ่มต้นของฟังก์ชัน main()
- สร้างวัตถุสแต็กเซนต์
- ใช้ฟังก์ชัน push() เพื่อแทรกองค์ประกอบ 32 ลงในสแต็ก
- ใช้ฟังก์ชัน push() เพื่อแทรกองค์ประกอบ 21 ลงในสแต็ก
- ใช้ฟังก์ชัน push() เพื่อแทรกองค์ประกอบ 39 ลงในสแต็ก
- ใช้ฟังก์ชัน push() เพื่อแทรกองค์ประกอบ 89 ลงในสแต็ก
- ใช้ฟังก์ชัน push() เพื่อแทรกองค์ประกอบ 25 ลงในสแต็ก
- พิมพ์ข้อความบนคอนโซล
- เรียกใช้ฟังก์ชัน createStack เพื่อดำเนินการแทรกลงในสแต็กตามข้างต้น
- พิมพ์ขนาดของสแต็กบนคอนโซลควบคู่ไปกับข้อความอื่นๆ
- พิมพ์องค์ประกอบที่ด้านบนของสแต็กบนคอนโซล
- พิมพ์ข้อความบนคอนโซล
- ลบองค์ประกอบที่ด้านบนของสแต็ก จากนั้นจะส่งคืนองค์ประกอบที่เหลืออยู่ในสแต็ก
- เรียกใช้ฟังก์ชัน createStack เพื่อดำเนินการข้างต้น
- โปรแกรมจะต้องคืนค่าเมื่อเสร็จสิ้นสำเร็จ
- ส่วนท้ายของฟังก์ชัน main()
emplace() และ สลับ()
นี่คือฟังก์ชันสแต็กแบบ inbuilt อื่นๆ:
- emplace()- สร้าง จากนั้นแทรกองค์ประกอบใหม่ที่ด้านบนของสแต็ก
- swap()- แลกเปลี่ยนเนื้อหาสแต็กกับเนื้อหาของสแต็กอื่น
3 ตัวอย่าง:
#include <iostream> #include <stack> #include <cstdlib> using namespace std; int main() { stack<int> st1; stack<int> st2; st1.emplace(12); st1.emplace(19); st2.emplace(20); st2.emplace(23); st1.swap(st2); cout << "st1 = "; while (!st1.empty()) { cout << st1.top() << " "; st1.pop(); } cout << endl << "st2 = "; while (!st2.empty()) { cout << st2.top() << " "; st2.pop(); } }
Output:
นี่คือภาพหน้าจอของรหัส:
คำอธิบายรหัส:
- รวมไฟล์ส่วนหัว iostream ไว้ในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัวของสแต็กในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัว cstdlib ไว้ในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมเนมสเปซมาตรฐานไว้ในโค้ดของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
- เรียกใช้ฟังก์ชัน main() ตรรกะของโปรแกรมจะถูกเพิ่มภายในเนื้อหาของฟังก์ชันนี้
- ประกาศสแต็กชื่อ st1 เพื่อเก็บค่าจำนวนเต็ม
- ประกาศสแต็กชื่อ st2 เพื่อเก็บค่าจำนวนเต็ม
- ใช้ฟังก์ชัน emplace() เพื่อแทรกจำนวนเต็ม 12 ลงในสแต็กชื่อ st1
- ใช้ฟังก์ชัน emplace() เพื่อแทรกจำนวนเต็ม 19 ลงในสแต็กชื่อ st1
- ใช้ฟังก์ชัน emplace() เพื่อแทรกจำนวนเต็ม 20 ลงในสแต็กชื่อ st2
- ใช้ฟังก์ชัน emplace() เพื่อแทรกจำนวนเต็ม 23 ลงในสแต็กชื่อ st2
- ใช้ฟังก์ชัน swap() เพื่อสลับเนื้อหาของสแต็กทั้งสอง st1 และ st2 เนื้อหาของสแต็ก st1 ควรถูกย้ายไปยังสแต็ก st2 เนื้อหาของสแต็ก st2 ควรถูกย้ายไปยังสแต็ก st1
- พิมพ์ข้อความบนคอนโซล
- ใช้คำสั่ง while และฟังก์ชัน Empty() เพื่อตรวจสอบว่าสแต็ก st1 ไม่ว่างเปล่าหรือไม่
- พิมพ์เนื้อหาของสแต็ก st1 บนคอนโซล ” ” จะเพิ่มช่องว่างระหว่างองค์ประกอบสแต็กเมื่อพิมพ์บนคอนโซล
- ดำเนินการฟังก์ชัน pop() บนสแต็ก st1 เพื่อลบองค์ประกอบด้านบน
- ส่วนท้ายของคำสั่ง while
- พิมพ์ข้อความบนคอนโซล จุดสิ้นสุดคือ a C++ คำสำคัญสำหรับบรรทัดสุดท้าย โดยจะเลื่อนเคอร์เซอร์ของเมาส์ไปที่บรรทัดถัดไปเพื่อเริ่มพิมพ์จากตรงนั้น
- ใช้คำสั่ง while และฟังก์ชัน Empty() เพื่อตรวจสอบว่าสแต็ก st2 ไม่ว่างเปล่าหรือไม่
- พิมพ์เนื้อหาของสแต็ก st2 บนคอนโซล ” ” จะเพิ่มช่องว่างระหว่างองค์ประกอบสแต็กเมื่อพิมพ์บนคอนโซล
- ดำเนินการฟังก์ชัน pop() บนสแต็ก st2 เพื่อลบองค์ประกอบด้านบน
- ส่วนท้ายของคำสั่ง while
- ส่วนท้ายของฟังก์ชัน main()
สแต็กใน STL
STL (Standard Template Library) มาพร้อมกับคลาสเทมเพลตที่มีให้ทั่วไป C++ โครงสร้างข้อมูล ดังนั้นจึงสามารถใช้สแต็กใน STL ได้เช่นกัน เราเพียงแค่รวมไลบรารีนี้ไว้ในโค้ดของเราและใช้เพื่อกำหนดสแต็ก
stack<T> st;
รูปแบบข้างต้นประกาศสแต็ก st ให้กับองค์ประกอบของชนิดข้อมูล T
4 ตัวอย่าง:
#include <iostream> #include <stack> #include <cstdlib> using namespace std; int main() { stack<int> st; st.push(12); st.push(19); st.push(20); cout << st.top(); cout << st.size(); }
Output:
นี่คือภาพหน้าจอของรหัส:
คำอธิบายรหัส:
- รวมไฟล์ส่วนหัว iostream ไว้ในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัวของสแต็กในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัว cstdlib ไว้ในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมเนมสเปซมาตรฐานไว้ในโค้ดของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
- เรียกใช้ฟังก์ชัน main() ควรเพิ่มตรรกะของโปรแกรมภายในเนื้อหาของฟังก์ชันนี้
- ประกาศ stack st เพื่อเก็บข้อมูลจำนวนเต็ม
- เพิ่มองค์ประกอบ 12 ลงในสแต็ก
- เพิ่มองค์ประกอบ 19 ลงในสแต็ก
- เพิ่มองค์ประกอบ 20 ลงในสแต็ก
- พิมพ์องค์ประกอบที่ด้านบนของสแต็กบนคอนโซล
- พิมพ์ขนาดของสแต็กบนคอนโซล
- ส่วนท้ายของฟังก์ชัน main()
สรุป
- สแต็กคือโครงสร้างข้อมูลที่ทำงานตามเทคนิค LIFO (Last In first Out)
- std::stack อนุญาตให้เพิ่มและลบรายการจากปลายด้านหนึ่งเท่านั้น
- คลาส std::stack เป็นคอนเทนเนอร์อะแดปเตอร์ที่เก็บรายการประเภทข้อมูลที่คล้ายกัน
- สามารถสร้างสแต็กได้จากคอนเทนเนอร์ลำดับต่างๆ
- หากคุณไม่ได้ระบุคอนเทนเนอร์ คอนเทนเนอร์ deque จะถูกใช้เป็นค่าเริ่มต้น
- ฟังก์ชัน push() ใช้สำหรับแทรกรายการลงในสแต็ก
- ฟังก์ชัน pop() ใช้สำหรับลบรายการด้านบนออกจากขั้นตอน
- ฟังก์ชัน Empty() ใช้สำหรับตรวจสอบว่าสแต็กว่างเปล่าหรือไม่