C++Templates中的例子: 用vector实现一个栈Stack类模板
2009-04-06 18:36
169 查看
++++++++++++++++++++++++Stack1.h
#include <vector> //standard vector class template: vector<>
#include <stdexcept> //stadard exception class
//Declaration of Class Template
template<typename T>
class Stack
{
private:
std::vector<T> elems; //elements
public:
void push(T const&); //push element
void pop(); //pop element
T top() const; //return top element
bool empty() const
{
return elems.empty();
}
};
//Implementation of Member Functions
template <typename T>
void Stack<T>::push(T const &elem)
{
elems.push_back(elem); //append copy of passed elem
}
template <typename T>
void Stack<T>::pop()
{
if(elems.empty()){
throw std::out_of_range("Stack<>::pop():empty stack");
}
elems.pop_back(); //remove last element
}
template <typename T>
T Stack<T>::top() const
{
if (elems.empty())
{
throw std::out_of_range("Stack<>::top() : empty stack");
}
return elems.back(); //return copy of last element
}
//SUMMARY
/*1. Vector<>对象常用的几种操作 //参见《STL Tutorial and Reference Guide》原书pp.131 Ch6.1
1. v.push_back(x) 在数组的最后添加一个值为t的数据 (pp.135)
2. v.pop_back() 删除最后一个元素 /!但当empty时unpredictable (pp.141)
3. v.back() 返回最后一个元素 /!但当empty时unpredictable (pp.141)
3. v.size() 当前使用数据的大小
4. v.empty() 判断vector是否为空
5. v
返回v中位置为n的元素
6. v1=v2 把v1的元素替换为v2元素的副本
7. v1==v2 判断v1与v2是否相等
8. !=、<、<=、>、>= 保持这些操作符惯有含义
*/
++++++++++++++++++++++++Stack1.cpp
// stack.cpp : 定义控制台应用程序的入口点。
//Use of Class Template Stack<>
#include <time.h>
#include "stdafx.h"
#include <string>
#include <iostream>
#include <cstdlib>
#include "stack1.h"
int _tmain(int argc, _TCHAR* argv[])
{
try{
Stack<int> intStack; //stack of ints; also can do this:"typedef Stack<int> IntStack;"
Stack<std::string> stringStack; //stack of strings
//manipulate int stack
intStack.push(7);
std::cout<<"intStack.top() = "<<intStack.top()<<std::endl;
//manipulate string stack
stringStack.push("hello");
std::cout<<"stringStack.top() = "<<stringStack.top()<<std::endl;
stringStack.pop();
stringStack.pop();
}
catch (std::exception const& ex){
std::cout<<"Exception ex catched: ex.what()= "<<ex.what()<<std::endl;
}
::system("pause");
return EXIT_FAILURE; //exit program with ERROR status(stdlib.h中定义了宏EXIT_FAILURE=1,EXIT_SUCCESS=0)
}
#include <vector> //standard vector class template: vector<>
#include <stdexcept> //stadard exception class
//Declaration of Class Template
template<typename T>
class Stack
{
private:
std::vector<T> elems; //elements
public:
void push(T const&); //push element
void pop(); //pop element
T top() const; //return top element
bool empty() const
{
return elems.empty();
}
};
//Implementation of Member Functions
template <typename T>
void Stack<T>::push(T const &elem)
{
elems.push_back(elem); //append copy of passed elem
}
template <typename T>
void Stack<T>::pop()
{
if(elems.empty()){
throw std::out_of_range("Stack<>::pop():empty stack");
}
elems.pop_back(); //remove last element
}
template <typename T>
T Stack<T>::top() const
{
if (elems.empty())
{
throw std::out_of_range("Stack<>::top() : empty stack");
}
return elems.back(); //return copy of last element
}
//SUMMARY
/*1. Vector<>对象常用的几种操作 //参见《STL Tutorial and Reference Guide》原书pp.131 Ch6.1
1. v.push_back(x) 在数组的最后添加一个值为t的数据 (pp.135)
2. v.pop_back() 删除最后一个元素 /!但当empty时unpredictable (pp.141)
3. v.back() 返回最后一个元素 /!但当empty时unpredictable (pp.141)
3. v.size() 当前使用数据的大小
4. v.empty() 判断vector是否为空
5. v
返回v中位置为n的元素
6. v1=v2 把v1的元素替换为v2元素的副本
7. v1==v2 判断v1与v2是否相等
8. !=、<、<=、>、>= 保持这些操作符惯有含义
*/
++++++++++++++++++++++++Stack1.cpp
// stack.cpp : 定义控制台应用程序的入口点。
//Use of Class Template Stack<>
#include <time.h>
#include "stdafx.h"
#include <string>
#include <iostream>
#include <cstdlib>
#include "stack1.h"
int _tmain(int argc, _TCHAR* argv[])
{
try{
Stack<int> intStack; //stack of ints; also can do this:"typedef Stack<int> IntStack;"
Stack<std::string> stringStack; //stack of strings
//manipulate int stack
intStack.push(7);
std::cout<<"intStack.top() = "<<intStack.top()<<std::endl;
//manipulate string stack
stringStack.push("hello");
std::cout<<"stringStack.top() = "<<stringStack.top()<<std::endl;
stringStack.pop();
stringStack.pop();
}
catch (std::exception const& ex){
std::cout<<"Exception ex catched: ex.what()= "<<ex.what()<<std::endl;
}
::system("pause");
return EXIT_FAILURE; //exit program with ERROR status(stdlib.h中定义了宏EXIT_FAILURE=1,EXIT_SUCCESS=0)
}
相关文章推荐
- c++实现vector类,并有一个排序和一个查找的泛型算法
- 一个通过BackgroundWorker实现WinForm异步操作的例子
- 利用Semaphore实现多线程的一个例子
- 用C#实现RSA加密的一个小例子
- 一个使用MFC实现Com聚合的例子
- 利用数学方法来大大降低一个逻辑判断实现的难度的例子
- 一个使用Pro*C实现增删改查的小例子
- 一个ListView根据标识加载不同布局,很简单的例子,就是聊天界面,你说话在右边好友在左边怎么实现呢.
- 一个实现下拉列表内汉字内容排序的例子
- 一个简单实现多条件查询的例子
- 【unity3d游戏开发之基础篇】unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子
- 一个App架构例子分析--UI层使用MVP模式;各层之间使用Otto实现通信
- 一个实现 IFormattable 接口的例子
- c/c++实现的一个动态分配内存的结构体数组(类似vector)
- 利用java实现的一个发送手机短信的小例子
- 射线的原理用法以及一个利用射线实现简单拾取的小例子
- Shell脚本实现的一个简易Web服务器例子分享
- 一个用asp.net实现Forms验证的例子
- 杨辉三角,一个vector实现,不复制,不用队列。
- C++ 以传入vector的方式实现返回一个数组