一、问题描述:
1、用C++实现一个数组类,类型和大小可设;提供越界检查;支持整体赋值.......
2、为其提供栈接口适配功能,使其能作为std::stack的容器
二、问题分析:
......
三、实现
////
//Nathan.Yu
//2008-6-13
////
#ifndef __YARRAY_H__
#define __YARRAY_H__
#include <algorithm>
namespace ylib
{
template <class T, size_t N>
class YArray
{
public:
// 类型定义
typedef T value_type;
typedef T* iterator;
typedef const T* const_iterator;
typedef T& reference;
typedef const T& const_reference;
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
/*由于内部数据成员以数组形式存放(无指针类型成员),故无需析构函数。
但若该数组中存放的是指针(即是一个指针数组),则需在外面手工delete掉各个元素,
否则就会造成内存泄露*/
//拷贝构造、类类型参数的赋值操作函数都使用编译器生成的默认函数
public:
//默认构造函数:将数组的所有元素初始化为T()默认值,该值也可显示提供
//不用expliict,使YArray<int, 10> c=20;形式的语句也能通过
/*explicit*/ YArray(const T& value = T())
{
for(int i=0; i<N; ++i)
elems[i] = value;
}
//为实现T2不为T的类型的一般构造
template <class T2>
YArray(const YArray<T2,N>& rhs)
{
std::copy(rhs.begin(), rhs.end(), (T*)elems);
}
//为实现T2不为T的类型的一般赋值
template <class T2>
YArray& operator=(const YArray<T2,N>& rhs)
{
std::copy(rhs.begin(), rhs.end(), begin());
return *this;
}
reference operator[](size_t i)
{
CheckIndex(i);
return elems[i];
}
const_reference operator[](size_t i) const
{
CheckIndex(i);
return elems[i];
}
size_t size() const
{
return N;
}
iterator begin()
{
return elems;
}
const_iterator begin() const
{
return elems;
}
iterator end()
{
return elems+N;
}
const_iterator end() const
{
return elems+N;
}
//以某个值填充整个数组
void fillwith(const T& value)
{
std::fill_n(begin(), N, value);
}
// swap 类型必须相同<T, N>
void swap (YArray<T, N>& rhs) {
std::swap_ranges(begin(), end(), rhs.begin());
}
T* c_array()
{
return elems;
}
const T* c_array() const
{
return elems;
}
private:
void CheckIndex(int i) const
{
if(i<0 || i>=N)
throw "ArrayIndexOutOfRange";
}
private:
T elems[N];
};
//为上面的数组实现一个std::stack适用的堆栈适配器
//即为stack实现其所需的基本要素(函数、接口)
template <class T, size_t N>
class YArrayStackAdapter
{
public:
typedef T value_type;
typedef T& reference;
typedef const T& const_reference;
typedef std::size_t size_type;
public:
YArrayStackAdapter():topIndex(0){}
bool empty() const
{
return topIndex == 0;
}
size_t size() const
{
return a.size();
}
T& back()
{
if(topIndex == 0)
throw std::exception("StackEmpty");
return a[topIndex-1];
}
void push_back(const T& value)
{
if(topIndex == N)
throw std::exception("StackOverFlow");
a[topIndex++] = value;
}
void pop_back()
{
if(topIndex == 0)
throw std::exception("StackEmpty");
--topIndex;
}
private:
size_t topIndex;
YArray<T, N> a;
};
}
#endif
分享到:
相关推荐
c++ 定义一个字符栈类Stack(包括类的实现)。数据成员包括一个存放字符的数组stck[ ]和一个栈指针tos。栈
用数组设计堆栈,主要实现push,pop操作, 并判断是否上衣下一
用c++模版实现的stack类,供初学者学习。 template ,int N> class Stack { public: Stack(); ~Stack(); void push(T t); T pop(); bool isEmpty(); private: T *m_pT; const int m_maxSize; ...
堆栈类stack的C++实现,包含了栈类的常规操作和方法,对初学者很有用哦。。
实现堆栈stack类模板,类模板的模型为:堆栈按数组索引减小的方向增长.
开发类C++类 实现 链表,栈的代码 ,用C++类来实现数据结构中的基本抽象数据类型
用java实现的栈Stack类,不继承任何集合类,用对象数组实现
3) 创建一个长度为3的DataStructure*类型的数组,将其3个元素分别指向str1, str2, stack,然后编写for循环调用Size()和Output()函数输出每个元素的大小和内容。 5. 输入输出样例: 1) 输入样例 A promising techni ...
stack类及其实现是基本的对堆栈的定义以及操作。
C++栈类模板 template class Stack { public: Stack(void); void Push(const T &item;); //将元素item压入栈 T Pop(void); //将栈顶元素弹出栈 void ClearStack(void); T Peek(void)const; //访问栈顶元素 ...
使用两个stack来模拟实现一个队列的功能
这是一个使用C++封装的Stack模板类,在VC++6.0环境下测试通过。栈的元素类型支持int,float,double,char也支持字符串。请多指正。
stack的实现,c++语言,使用类,实现了stack的各种功能,但是不建议使用此替代标准的stack
对于不会用堆栈和对堆栈理解不是很深入深入的初学者来说是一个不容错过的资料。拿来和大家共享一下!
使用c++标准库实现如"3+(3*5)"字符串的运算解析,本例子在Dev C++11中编译运行正常
以C++类的方式实现整型元素堆栈(stack)数据结构。链栈支持如下基本操作或功能:构造空栈;销毁栈;清除栈;判断栈是否为空;求栈长度;返回栈顶元素;插入栈顶元素;弹出删除栈顶元素;遍历打印栈元素。
c++stack_和_queue用法,很好的介绍了STL中stack和queue的用法,及其使用方法
实验目的 1. 掌握栈的操作特性及其顺序存储和链式存储结构 2. 灵活运用栈解决实际问题。 实验内容 利用栈实现算符优先法进行表达式求值,测试表达式为: 5*(3+2)-6/2# 提示:利用c++的stack容器。
数据结构实验用堆栈实现计算器,大二数据结构实验
栈的实现,Stack栈使用符号进出 静态栈,与链表栈的实例