Натрупвайте C++ STL с пример
Какво е std::stack?
Стекът е структура от данни, която работи въз основа на техниката LIFO (последен влязъл, първи излязъл). std::stack позволява добавяне и премахване на елементи само от единия край.
Класът std::stack е контейнерен адаптер. Контейнерните обекти съдържат данни от подобен тип данни. Можете да създадете стек от различни контейнери за последователност. Ако не е предоставен контейнер, по подразбиране ще се използва deque containe. Контейнерните адаптери не поддържат итератори, така че не могат да се използват за манипулиране на данни.
Синтаксис на стека
За да създадем стек, трябва да включим заглавен файл в нашия код. След това използваме този синтаксис, за да дефинираме 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++ стекът поддържа следните основни операции:
- push – Добавя/избутва елемент в стека.
- pop – премахва/изважда елемент от стека.
- peek – Връща горния елемент от стека, без да го премахва.
- isFull – Проверява дали даден стек е пълен.
- isEmpty – Проверява дали даден стек е празен.
Реализация на стека
Стъпка 1) Първоначално имаме празен стек. Горната част на празен стек е зададена на -1.
Стъпка 2) След това избутахме елемент 5 в стека. Горната част на стека ще сочи към елемент 5.
Стъпка 3) След това избутахме елемент 50 в стека. Горната част на стека се измества и сочи към елемент 50.
Стъпка 4) След това извършихме изскачаща операция, премахвайки горния елемент от стека. Елементът 50 се изважда от стека. Горната част на стека сега сочи към елемент 5.
push() и pop()
Функциите 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(); } }
Изход:
Ето екранна снимка на кода:
Обяснение на кода:
- Включете заглавния файл на iostream в нашия код, за да използвате неговите функции.
- Включете заглавния файл на стека в нашия код, за да използвате неговите функции.
- Включете пространството от имена std в нашия код, за да използвате неговите класове, без да го извиквате.
- Извикайте функцията main(). Логиката на програмата трябва да се добави в тази функция.
- Създайте стек st за съхраняване на цели числа.
- Използвайте функцията push(), за да вмъкнете стойността 10 в стека.
- Използвайте функцията push(), за да вмъкнете стойността 20 в стека.
- Използвайте функцията push(), за да вмъкнете стойността 30 в стека.
- Използвайте функцията push(), за да вмъкнете стойността 40 в стека.
- Използвайте функцията pop(), за да премахнете най-горния елемент от стека, тоест 40. Сега най-горният елемент става 30.
- Използвайте функцията pop(), за да премахнете най-горния елемент от стека, тоест 30. Най-горният елемент сега става 20.
- Използвайте цикъл while и функция empty(), за да проверите дали стекът НЕ е празен. The ! е операторът NOT.
- Отпечатване на текущото съдържание на стека на конзолата.
- Извикайте функцията pop() в стека.
- Край на тялото на цикъла while.
- Край на тялото на функцията main().
празен(), размер(), топ()
Стековете имат вградени функции, които можете да използвате, за да си поиграете със стека и неговите стойности. Те включват:
- празен()- проверява дали даден стек е празен или не.
- 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; }
Изход:
Ето екранна снимка на кода:
Обяснение на кода:
- Включете заглавния файл на iostream в нашия код, за да използвате неговите функции.
- Включете заглавния файл на стека в нашия код, за да използвате неговите функции.
- Включете пространството от имена std в нашата програма, за да използвате неговите класове, без да го извиквате.
- Създайте функцията createStack, която можем да използваме за създаване на стека mystack. Стекът ще съдържа набор от цели числа.
- Началото на тялото на функцията createStack.
- Създайте екземпляр на типа данни mystack и му дайте името ms.
- Използвайте цикъла while и функцията empty(), за да проверите дали стекът е празен.
- Началото на тялото на цикъла while.
- Използвайте функцията top(), съхранена в горната част на стека. Символът \t ще създаде нов раздел.
- Използвайте функцията pop(), за да изтриете елемента в горната част на стека.
- Край на тялото на цикъла while.
- Отпечатайте празен ред на конзолата.
- Край на тялото на функцията createStack.
- Извикайте функцията main(). Логиката на програмата трябва да се добави в тялото на функцията main().
- Началото на тялото на функцията main().
- Създайте стеков обект st.
- Използвайте функцията push(), за да вмъкнете елемент 32 в стека.
- Използвайте функцията push(), за да вмъкнете елемент 21 в стека.
- Използвайте функцията push(), за да вмъкнете елемент 39 в стека.
- Използвайте функцията push(), за да вмъкнете елемент 89 в стека.
- Използвайте функцията push(), за да вмъкнете елемент 25 в стека.
- Отпечатайте малко текст на конзолата.
- Извикайте функцията createStack, за да изпълните горните операции за вмъкване в стека.
- Отпечатайте размера на стека на конзолата заедно с друг текст.
- Отпечатайте елемента в горната част на стека на конзолата.
- Отпечатайте малко текст на конзолата.
- Изтрийте елемента в горната част на стека. След това ще върне елементите, останали в стека.
- Извикайте функцията createStack, за да изпълните горните операции.
- Програмата трябва да върне стойност при успешно завършване.
- Край на тялото на функцията main().
emplace() и swap()
Това са други вградени стекови функции:
- 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(); } }
Изход:
Ето екранна снимка на кода:
Обяснение на кода:
- Включете заглавния файл на iostream в нашия код, за да използвате неговите функции.
- Включете заглавния файл на стека в нашия код, за да използвате неговите функции.
- Включете заглавния файл cstdlib в нашия код, за да използвате неговите функции.
- Включете пространството от имена std в нашия код, за да използвате неговите класове, без да го извиквате.
- Извикайте функцията 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;
Горният синтаксис декларира стек към елементи от тип данни 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(); }
Изход:
Ето екранна снимка на кода:
Обяснение на кода:
- Включете заглавния файл на iostream в нашия код, за да използвате неговите функции.
- Включете заглавния файл на стека в нашия код, за да използвате неговите функции.
- Включете заглавния файл cstdlib в нашия код, за да използвате неговите функции.
- Включете пространството от имена std в нашия код, за да използвате неговите класове, без да го извиквате.
- Извикайте функцията main(). Логиката на програмата трябва да се добави в тялото на тази функция.
- Декларирайте стек st за съхраняване на целочислени данни.
- Добавете елемент 12 към стека.
- Добавете елемент 19 към стека.
- Добавете елемент 20 към стека.
- Отпечатайте елемента в горната част на стека на конзолата.
- Отпечатайте размера на стека на конзолата.
- Край на тялото на функцията main().
Oбобщение
- Стекът е структура от данни, която работи въз основа на техниката LIFO (последен входящ, първи изходящ).
- std::stack позволява добавяне и премахване на елементи само от единия край.
- Класът std::stack е контейнерен адаптер, който съдържа елементи от подобен тип данни.
- Стек може да бъде създаден от различни контейнери на последователност.
- Ако не предоставите контейнер, контейнерът deque ще се използва по подразбиране.
- Функцията push() е за вмъкване на елементи в стека.
- Функцията pop() е за премахване на горния елемент от стъпката.
- Функцията empty() служи за проверка дали даден стек е празен или не.