数据结构之通过类模板实现栈

2018-06-17 23:32:24来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

  闲来无事,写了一段通过类模板实现一个简单栈的代码,分享给大家.....

  (关于栈的更多的详细信息,详见: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/

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:SOUI界面库 添加 windows系统文件图标皮肤

下一篇:C++里创建 Trie字典树(中文词典)(二)(插入、查找、导入、导