C++类模板之栈的简单操作

C++中模板的使用是泛型编程的一种,当使用模板的时候,不必去考虑一个函数、一个类等对具体数据类型的处理,这样大大的减少的代码的数量,提高了程序的效率。当程序中需要使用到一个函数或者类是,编译器将根据模板生成一个能够处理特定数据的代码块。

模板与函数重载区别在于,当具体实现的功能或行为一样,只是处理的数据类型不同时,使用模板;当具体的功能、行为或函数体的基本一直,函数形参的个数、类型都不一致时,建议使用重载。

再此,感谢小甲鱼老师。www.fishc.com

该程序中,只是一个简单的demo,方便理解类模板与栈,没有做安全检查(进栈是栈溢出的检出,出栈时,栈是否为空等)

1、头文件,stack.h

#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED

/*
** Copyright (C) QPSOFT.COM All rights reserved.
*/
template <class T>
class Stack
{
public:
    Stack(unsigned int size=100);//栈大小
    ~Stack();
    void push(T val);//进栈
    T pop();//出栈
private:
    unsigned int size;
    unsigned int sp;//指向栈中一个位置的指针
    T *data;//开辟一个新空间,将首地址给T 类型的指针data
};


#endif // STACK_H_INCLUDED

2、源文件,stack.cpp

#include "stack.h"
//利用构造函数初始化
template <class T>
Stack<T>::Stack(unsigned int size)//Stack<T>::Stack(unsigned int size)中<T>不可少,不然编译器没有办法和普通类做区别
{
    this->size=size;//因为形参与实参同名size,用this->size表明为类数据成员
    data=new T[size];
    sp=0;
}
//析构函数
template <class T>
Stack<T>::~Stack()
{
    delete []data;
}
//进栈,每进一个元素,sp加1,指向下一个元素地址
template <class T>
void Stack<T>::push(T val)
{
    data[sp++]=val;
}
//出栈,必须sp先减一个才能指向最后一个进栈的元素。
//因为,进栈的时候,每进一个元素,sp加1,指向下一个元素地址
//当进最后一个元素时,sp加一指向了下一个元素地址
template <class T>
T Stack<T>::pop()
{
    return data[--sp];
} 
3、主函数main.cpp

#include<iostream>
#include<string>

#include "stack.cpp"

using namespace std;

int main()
{
    Stack<int> intstack(100);
    intstack.push(1);
    intstack.push(2);
    intstack.push(3);
    cout<<intstack.pop()<<endl;
    cout<<intstack.pop()<<endl;
    cout<<intstack.pop()<<endl;

    Stack<string>  stringstack(100);
    stringstack.push("i love you");
    stringstack.push("i like you");
    stringstack.push("i miss you");
    cout<<stringstack.pop()<<endl;
    cout<<stringstack.pop()<<endl;
    cout<<stringstack.pop()<<endl;

    return 0;
}
//显示结果,先进后出
/*
3
2
1
i miss you
i like you
i love you

*/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章