栈
2016-04-08 12:46
204 查看
栈
1、只允许在末端进行插入和删除的线性表。栈具有后进先出的特性
2、实现方法(动态):
函数声明如下:
测试用例:
1、只允许在末端进行插入和删除的线性表。栈具有后进先出的特性
2、实现方法(动态):
函数声明如下:
template<class T> class Stack { public: Stack(); ~Stack(); public: void Push(const T& s); void Pop(); size_t Size(); bool Empty(); T& Top();//要修改,所以传引用,而且其他的非基本类型,不加应用生成临时变量,效率低,例如string,和智能指针 protected: void _CheckCapacity(); protected: T* _a;//实现动态的栈 size_t _top; size_t _capacity; };函数定义如下:
template<class T>//记住写法 Stack<T>::Stack() :_a(NULL) , _top(0) , _capacity(0) {} template<class T> Stack<T>::~Stack()//注意~的位置 { if (_a != NULL) { delete[] _a; } } template<class T> void Stack<T>::_CheckCapacity() { if (_a == NULL) { _capacity = 3; _a = new T[_capacity]; return; } if (_top == _capacity) { _capacity = 2 * _capacity; T* tmp = new T[_capacity];//不用malloc和free是因为new和delete会调构造函数和析构函数 for (size_t i = 0; i < _top; i++)//用memcpy有身前拷贝的问题 { tmp[i] = _a[i]; } delete[] _a; _a = tmp; } } template<class T> void Stack<T>::Push(const T& x) { _CheckCapacity(); _a[_top++] = x; } template<class T> void Stack<T>::Pop() { assert(_top > 0);//防御式编程 assert(_a != NULL); --_top; } template<class T> size_t Stack<T>::Size() { return _top; } template<class T> bool Stack<T>::Empty() { return _top == 0; } template<class T> T& Stack<T>::Top() { return _a[_top - 1];//不能_a[--top] }
测试用例:
void TestStack() { Stack<int> s1; s1.Push(1); s1.Push(2); s1.Push(3); s1.Push(4); s1.Push(5); while (!s1.Empty())//删一个,打印一个 { cout << s1.Top() << " "; s1.Pop(); } }
相关文章推荐
- Java实现栈和队列面试题
- 栈和队列导图
- 数据结构第三章结构图
- 算法导论 第十章:基本数据结构
- HDU 1702 ACboy needs your help again!
- 学习笔记----容器中的队列的简单的使用
- 中缀表达式的值
- 用队列对扑克牌排序 -优先队列法
- 【数据结构】 停车场管理优化
- (C语言版)栈和队列(一)——实现链式栈和链式队列的基本操作以及遇到的问题
- (C语言版)栈和队列(二)——实现顺序存储栈和顺序存储队列的相关操作
- Java数据结构和算法--栈与队列
- 数据结构之栈和队列
- 面试题——栈与队列的应用(上)
- 利用两个队列实现栈---进栈和出栈
- 数据结构之非递归遍历和层次遍历(C语言版)
- 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
- 浅析数据结构与算法1--栈和队列
- 算法学习记录五(C++)--->两个栈实现队列
- 栈和队列