类模板.cpp
// 栈的特点
// 栈(stack)是以一种线性存储结构,
// 它具有一下特点:栈中的数据元素遵守“先进后出(First in Last out)后进先出”的原则,
// 简称FILO结构;
// 限定只能在栈顶进行插入和删除操作。
#include <iostream>
const int capacity = 5; // 栈的容量
// 定义栈的一个类模板
template<class T> // 数据类型参数化
class Stack // 定义类(类模板)
{
private:
T array[capacity]; // 顺序栈,T 为元素类型(可变)
int topCount; // 栈顶元素的索引位置,即栈的有效数量,int 不可变
public:
Stack() {
topCount = -1;
} // 构造函数,初始化栈顶
public:
bool push(T ob); // 压栈操作, 入栈函数,T 为参数的类型
T topv(); // 获取栈顶元素
T pop(); // 弹栈操作, 出栈函数,T 为返回值类型
bool isEmpty(); // 判空操作
int size(); // 求栈的大小
}; // 这个分号不能少
//----------------------类外实现部份-----------------------
/* 栈的判空操作 */
template<typename T>
bool Stack<T>::isEmpty() {
return topCount == -1; // 栈元素为-1时为栈空
}
/* 获取栈顶元素 */
template<typename T>
T Stack<T>::topv() {
if (topCount != -1) {
return array[topCount];
}
}
/* 返回栈的大小 */
template<typename T>
int Stack<T>::size() {
return topCount + 1;
}
// --------两个成员函数的类外实现------------
/* 压栈,插入 */
template<typename T>
bool Stack<T>::push(T ob) // 入栈成员函数
{
if (topCount < capacity - 1) { // 先判断是否栈满
array[++topCount] = ob;
return 1;
}
return 0;
}
/* 弹栈 */
template<typename T>
T Stack<T>::pop() // 出栈成员函数
{
if (topCount != -1) { // 先判断是否是空栈
return array[topCount--];
}
}
Unit1.cpp
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "类模板.cpp"
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
}
// ---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) {
// 定义栈
Stack<char>s1;
Stack<int>s2, *sp = &s2;
Stack<UnicodeString>s3, *sp3 = &s3;
// -------------------字符------------------------
s1.push('a');
s1.push('b');
s1.push('c');
s1.push('d');
Memo1->Clear();
if (s1.isEmpty()) {
Memo1->Lines->Add("栈为空");
}
else {
Memo1->Lines->Add("栈的大小:" + IntToStr(s1.size()));
Memo1->Lines->Add("栈顶元素: " + (UnicodeString)s1.topv());
Memo1->Lines->Add("pop s1:");
while (!s1.isEmpty())
Memo1->Lines->Add(s1.pop());
}
// --------------------整型-----------------------
s2.push(1);
s2.push(2);
s2.push(3);
s2.push(4);
s2.push(5);
if (s2.isEmpty()) {
Memo1->Lines->Add("栈为空");
}
else {
Memo1->Lines->Add("栈的大小:" + IntToStr(s2.size()));
Memo1->Lines->Add("栈顶元素: " + (UnicodeString)s2.topv());
Memo1->Lines->Add("pop s2:");
while (!s2.isEmpty())
Memo1->Lines->Add(sp->pop());
}
// --------------------字符串-----------------------
s3.push("北京");
s3.push("上海");
s3.push("深圳");
s3.push("衡阳");
s3.push("成都");
if (!s3.push("东京"))
Memo1->Lines->Add("栈容量不够,东京插入失败");
if (s3.isEmpty()) {
Memo1->Lines->Add("栈为空");
}
else {
Memo1->Lines->Add("栈的大小:" + IntToStr(s3.size()));
Memo1->Lines->Add("栈顶元素: " + (UnicodeString)s3.topv());
Memo1->Lines->Add("pop s3:");
while (!s3.isEmpty())
Memo1->Lines->Add(sp3->pop());
}
}
// ---------------------------------------------------------------------------
输出效果