Пример за обектно ориентирана реализация на свързан стек
Ще се възползваме от тясната връзка между св. списъци и стекове чрез повторно използване на класа на списъците. Ще приложим 2 разновидности на повторното използване. Отначало ще реализираме класа на стековете чрез открито наследяване на класа на списъците. След това ще реализираме аналогично дестващ клас на стековете чрез композиция по пътя на включване на класа на списъците като скрит елемент на класа на стековете. Тези 2 класа стекове се реализират като шаблони, за да може по-нататък повторно да бъдат използвани.
//файл stack.h
#ifndef STACK_H
#define STACK_H
#include “list.h”
template<class STACKTYPE>
class Stack:private List<STACKTYPE>{
public:
void push(const STACKTYPE &d){
insertAtFront(d);
}
bool pop(STACKTYPE &d){
return removeFromFront(d);
}
bool isStackEmpty() const{
return isEmpty();
}
void printStack() const{
print();
}
};
#endif
Тук се създава шаблон на класа Stack чрез закрито наследяване на шаблона на класа List. Необходимо е Stack-a да има член функции push, pop, isStackEmpty и print. Те по същество са член функции на шаблона на класа списъците – insertAtFront, removeFromFront, isEmpty, print. Шаблонът на класа List включва и други функции, които ние не искаме да направим достъпни чрез открития интерфейс на класа Stack, затова наседяването е закрито, което прави всички функции на List закрити в шаблона на класа Stack.
Програма, която тества класа Stack.
//файл testst.cpp
#include<iostream>
#include “stack.h”
using std::endl;
void main()
{
Stack<int> intStack;
int popInt, i;
cout<<”Обработка на стека с цели числа “<<endl;
for(i = 0; i < 4; i++){
intStack.push(i);
intStack.printStack();
}
while(! intStack.isStackEmpty()){
intStack.pop(popInt);
cout<<popInt<<” е изключен от стека.”<<endl;
intStack.printStack();
}
/*Целите числа от 0 до 3 се добавят в стека intStack и след това се изключват от него. Шаблона на класа на стековете можем да използваме реализация на стека doubleStack за обработка на числа с плаваща точка*/
Stack<double> doubleStack;
double val = 1.1, popdouble;
cout<<”Обработка на стека с числа с плаваща точка “<<endl;
for(i = 0; i < 4; i++){
doubleStack.push(val);
doubleStack.printStack();
val += 1.1;
}
while(!doubleStack.isStackEmpty()){
doubleStack.pop(popdouble);
cout<<popdouble<<” е изключен от списъка! “<<endl;
doubleStack.printStack();
}
}
//Числата 1.1, 2.2, 3.3, 4.4 се добавят в doubleStack и след това се изключват.
Друг начин за реализация на шаблона Stack е повторно използване на класа List чрез композиция ( влагане ).
// файл stack_c.h
#ifndef STACK_C
#define STACK_C
#include “list.h”
template <class STACKTYPE>
class Stack{
public:
void push(const STACKTYPE &d)
{ s.insertAtFront(d); }
bool pop(STACKTYPE &d)
{ return s.removeFromFront(d); }
void printStack() const
{ s.print() }
private:
List<STACKTYPE> s;
};
#endif
/* Тук шаблона на класа Stack включва обекта s от тип List<STACKTYPE>. Тук може да се
използва същата програма за тестване с разлика, че трябва да се включи “stack_c.h”, вместо
“stack.h”. Резултатът от изпълнението е същия.*/
Сходни статии:
- Пример за обектно – ориентирана реализация на свързан списък В примера се използва шаблон на класа List за обработка на списък от данни от цял тип и списък от данни с плаваща точка. Програма driver дава възможност да се...
- Свързан стек. Основни операции typedef int INFO_TYPE; struct stack_el{ INFO_TYPE info; stack_el *link; }; //Функция за добавяне на елемент void push(stack_el **t, INFO_TYPE x) //Указателят към върха на стека трябва да се промени, затова...
- Изпълнението на C++ конструктори и деструктори за обекти от произволен клас Задача на C++ за конструктори и деструктори от произволен клас Да се дефинират класовете People, Student и PStudent, така че инициализиращите действия да се изпълняват от подходящи конструктори. Разрушителните действия...
- Обектно-ориентирано проектиране (ООП). Правила за обектно-ориентирано проектиране Проектиране на класове и обекти ПЪРВИ ЕТАП ОТДЕЛЯНЕ НА КЛАСОВЕТЕ И ОБЕКТИТЕ ОТ ПО НА ЗАДАЧАТА Класове и обекти могат да бъдат: реални неща от програмиране на обекти абстракции в...
- Търсене на нов елемент по ключ и добавяне на нов елемент в свързан списък void search ( student *first, unsigned key, float value ) // студент с ф. № key и с value се задава новия му успех { student *ptr = first; while...