03.06.2014, 22:24. Просмотров 1025. Ответов 0
пример шаблона класса "стек" (Borland Builder):
stack.h
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
| template <class Type>
class Stack
{
private:
Type* stk_ptr;
int max_len;
int top;
public:
Stack (int size); //конструктор
Stack (); // конструктор по умолчанию
Stack (const Stack<Type> &L); //конструктор копирования
~Stack(); // деструктор
void push(Type element); // основные операции
void pop ();
Type stacktop();
int showtop(){return top;};
bool empty();
// перегрузка операции сложения двух стеков (+)
Stack<Type>& operator + (Stack<Type> &L);
bool operator > (Stack<Type> &L); // перегрузка операции >
Type* info(){return stk_ptr;};
};
Описание методов класса:
//--------------- конструктор ----------------------------
template <class Type>
Stack<Type>::Stack(int size)
{
stk_ptr= new Type [size];
max_len=size-1;
top=-1;
}
//-------------- конструктор копирования (операция присваивания =)-----------------
template <class Type>
Stack<Type>::Stack(const Stack<Type> &L)
{
stk_ptr= new Type [L.max_len+1];
max_len=L.max_len;
top=L.top;
for (int i=0; i<=top; i++)
stk_ptr[i]=L.stk_ptr[i];
}
//---------------- конструктор по умолчанию ---------
template <class Type>
Stack<Type>::Stack()
{
stk_ptr= new Type [100];
max_len=99;
top=-1;
}
//---------------деструктор-----------------
template <class Type>
Stack<Type>::~Stack()
{
delete [] stk_ptr;
}
//----------------вывод вершины стека--------
template <class Type>
Type Stack<Type>::stacktop()
{
return stk_ptr[top];
}
//----------------вставка значение в стек----
template <class Type>
void Stack<Type>::push(Type element)
{
if (top==max_len) return ;
stk_ptr[++top]=element;
}
//---------------удаление значения из стека----
template <class Type>
void Stack<Type>:: pop ()
{
if (empty()) return ;
top--;
}
//----метод – предикат , проверка стека на пустоту----------
template <class Type>
bool Stack<Type>:: empty()
{
return (top==-1);
}
//---- перегруженная операция сложения двух стеков-------
template <class Type>
Stack<Type>& Stack<Type>::operator + (Stack<Type> &L)
{ int i=0;
Stack<Type>* S=new Stack<Type> (max_len+L.max_len+2);
for (; i<=top; i++)
S->push(stk_ptr[i]);
for (i=0; i<=L.top; i++)
S->push(L.stk_ptr[i]);
return *S;
}
//-----------перегруженная операция сравнения двух стеков-----------
template <class Type>
bool Stack<Type>::operator > (Stack<Type> &L)
{
return (top>L.top);
} |
|
Пример программы-клиента класса.
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| Stack<int> *stk2; // параметризация шаблона класса типом int
stk2=new Stack<int>(10); stk2->push(56); stk2->push(67);
Edit1->Text=stk2->stacktop();
Stack<double> stk1(20); stk1.push(23.5); stk1.push(-34.5); Edit1->Text=stk1.showtop();
// применение перегруженных операций
Stack<double> stk5=stk1; stk5.push(45.1);
Stack<double> st; // параметризация шаблона класса типом double
st=stk1+stk5; st.push(56.1);
double* m=st.info(); Memo1->Clear();
for(int i=0; i<=st.showtop(); i++) Мемо1->Lines->Add(FloatToStr(m[i]));
Edit2->Text=st.showtop();
if (stk1>st) Edit2->Text=" больше"; else Edit2->Text="меньше "; |
|
как на основе этой программы написать следующую программу на Visual Studio:
Решить на базе шаблона класса стек следующие задачи, создав программу - клиент:
1. Создать объект типа стек, параметризировав его типом AnsiString
2. Создать 2 объекта типа стек, параметризировав их типом float и вычислить сумму двух стеков.
3. Создать объект типа стек, параметризировав его типом Person
Пример описания и объявления объекта для решения задания:
C++ |
1
2
3
4
5
6
7
8
9
10
| struct Person {
string Name;
string Fam;
int Data_b;
bool Sex;
bool operator ==(Person &); //перегрузка операции сравнения на равенство
…
};
Stack <Person> StackPerson; |
|