闲来无事,写了一段通过类模板实现一个简单栈的代码,分享给大家.....
(关于栈的更多的详细信息,详见:http://www.cplusplus.com/reference/stack/stack/?kw=stack)
栈的声明及实现
//Stack.h
//代码量太少,就不分文件实现了
//温馨提示:模板程序分文件时,请将头文件后缀名修改为.hpp
#ifndef __STACK_H__
#define __STACK_H__
template<typename T>
class Stack{
public:
//构造函数
Stack()
:_pBase(NULL)
,_uSize(0)
,_uCapacity(0){}
//析构函数
~Stack(){
if(_pBase!=NULL){
delete[] _pBase;
_pBase = NULL;
}
_uSize = 0;
_uCapacity = 0;
}
public:
//判断是否为空
bool Empty(){
return _uSize==0;
}
//获取栈内有效元素个数
size_t Size(){
return _uSize;
}
//获取栈顶元素
T &Top(){
return _pBase[_uSize-1];
}
//获取栈顶元素const版本
const T &Top()const{
return _pBase[_uSize-1];
}
//入栈
void Push(const T &x){
_CheckCapacity(); //检测是否需要进行扩容操作,并进行扩容
_pBase[_uSize++] = x; //插入数据、有效元素个数自增
}
//出栈
void Pop(){
if(!Empty()){ //栈非空
_uSize--; //有效元素自减
}
}
private:
//检测是否扩容
void _CheckCapacity(){
if( _uSize>=_uCapacity ){
size_t NewCapacity = _uCapacity*2+10; //扩容后容量
T * NewBase = new T[NewCapacity]; //新空间
if(_pBase!=NULL){ //不是空栈
for(size_t i=0; i<_uSize; ++i){ //拷贝数据
NewBase[i] = _pBase[i];
}
delete[] _pBase; //释放原有空间
}
_pBase = NewBase; //更新栈的数据指针
_uCapacity = NewCapacity; //更新栈的容量
}
}
private:
T * _pBase; //基址
size_t _uSize; //有效元素
size_t _uCapacity; //大小
};
#endif
测试代码
#include<iostream>
#include"Stack.h"
//测试函数,测试基本接口
void StackTest(){
Stack<int> s1;
s1.Pop(); //测试对空栈进行Pop
s1.Push(1); //第一次扩容
s1.Pop();
s1.Push(1);
s1.Push(2);
s1.Push(3);
s1.Push(4);
s1.Push(5);
s1.Push(6);
s1.Push(7);
s1.Push(8);
s1.Push(9);
s1.Push(10);
std::cout<<"目前栈内有 "<<s1.Size()<<" 个元素"<<std::endl;
s1.Push(11); //第二次扩容
std::cout<<"栈顶元素为:"<<s1.Top()<<std::endl;
s1.Top() = 20;
std::cout<<"修改后:"<<s1.Top()<<std::endl;
}
int main(){
StackTest();
return 0;
}
总结:
以上代码,仅供个人娱乐.
在STL中的栈(stack)和队列(queue)的模板参数列表里除了类型(T)以外还有一个容器(Container).
栈(stack)和队列(queue)在这里都默认使用了双向队列(deque)作为容器(Container).
关于双向队列的更多详细信息详见:http://www.cplusplus.com/reference/deque/deque/