基于Vector实现适配器stack(顺序栈)
来源:互联网 发布:淘宝化妆品推广文章 编辑:程序博客网 时间:2024/06/06 02:01
栈遵循先进后出,后进先出的原则,它的插入和删除都是在栈顶进行操作,是一种特殊的线性顺序表,因此,实现栈我们通常建立在顺序表的基础上。下来我们利用之前实现过的容器Vector中的一部分接口来实现stack
(在这里分别用了模板参数和模板的模板参数两种方式来实现来实现)
stack.h:
#define _CRT_SECURE_NO_WARNINGS 1#pragma once#include "Vector.h"//模板参数template<class T,class Container>class Stack1{public: Stack1()//构造函数 {} void Push(const T data) { _con.PushBack(data); } void Pop() { _con.PopBack(); } bool Empty() { return _con.Empty(); } size_t Size() { return _con.Size(); } T& Top() { return _con.Back(); } const T& Top()const { return _con.Back(); }private: Container _con;};//模板的模板参数template<class T, template<class > class Container >class Stack2{public: Stack2()//构造函数 {} void Push(const T data) { _con.PushBack(data); } void Pop() { _con.PopBack(); } bool Empty() { return _con.Empty(); } size_t Size() { return _con.Size(); } T& Top() { return _con.Back(); } const T& Top()const { return _con.Back(); }private: Container<T> _con;};
Vector.h
#define _CRT_SECURE_NO_WARNINGS 1#pragma once#include <iostream>using namespace std;#include <assert.h>template<class T>class Vector{public: typedef T* Iterator; typedef const T* IteratorConst;public: //无参构造函数 Vector() :_start(0) , _finish(0) , _endOfStorage(0) {} //有参构造函数 Vector(const T* array,size_t size) :_start(new T[size]) , _finish(_start) , _endOfStorage(_start+size) { for (size_t i = 0; i < size; i++) { *_finish++ = array[i]; } } //析构函数 ~Vector() { if (_start) { delete[] _start; _start = 0; _finish = 0; _endOfStorage = 0; } } //尾插 void PushBack(const T& data) { _CheckCapacity(); *_finish++ = data; } //尾删 void PopBack() { --_finish; } //获取有效元素个数 size_t Size()const { return _finish - _start; } //判断是否为空 bool Empty()const { return _start == _finish; } //返回尾元素 T& Back() { assert(_start); return _start[Size() - 1]; } const T& Back()const { assert(_start); //return _start[Size() - 1]; return *(End() - 1); } //清空顺序表 void Clear() { _finish = _start; }private: //检查容量 void _CheckCapacity() { T* temp; if (_finish == _endOfStorage) { size_t capacity = 2 * (_endOfStorage - _start) + 3; temp = new T[capacity]; T* pos = _start; size_t i = 0; while (pos < _endOfStorage) { temp[i++] = *pos++; } delete _start; _start = temp; _finish = _start + i; _endOfStorage = _start + capacity; } } //重载输出运算符 template<class T> friend ostream& operator<<(ostream& _cout, const Vector<T>& d) { for (size_t i = 0; i < d.Size(); i++) { _cout << d[i] << " "; } return _cout; }private: T* _start; T* _finish; T* _endOfStorage;};
测试代码:
void FunTest1(){ Stack1<int,Vector<int>> s1; for (int i = 0; i < 5; i++) { s1.Push(i); } while (!s1.Empty()) { cout << s1.Top() << " "; s1.Pop(); } cout << endl;}void FunTest2(){ Stack2<int,Vector> s1; for (int i = 0; i < 5; i++) { s1.Push(i); } while (!s1.Empty()) { cout << s1.Top() << " "; s1.Pop(); } cout << endl;}int main(){ FunTest1(); FunTest2(); system("pause"); return 0;}
读者可自行进行跟踪调试,看看结果
阅读全文
0 0
- 基于Vector实现适配器stack(顺序栈)
- 基于Vector实现C++中的适配器stack(顺序栈)
- stack(栈)!基于顺序表实现
- 适配器Stack----deque/Vector做空间配置器实现
- 【STL】栈适配器stack
- 封装顺序栈(模拟实现stack)
- 封装顺序栈(模拟实现stack)
- 早就该出手把"容器适配器"这么看似“高大上”的概念拉下"神坛"了---用vector来实现stack
- Stack(1)Stack的顺序实现
- STL容器适配器-栈 stack
- 模拟实现容器适配器 stack queue
- 顺序栈(sequence stack)
- 【数据结构】顺序栈 Stack
- 顺序栈(Sequential Stack)
- 顺序栈(Stack)
- 基于vector的栈实现(C++)
- stl 顺序容器适配器之stack, priority_queue, queue用法
- Structure.Stack 栈(包含顺序栈、链表栈的实现)
- 二叉排序数(创建,插入,删除,查找及前序、中序、后序遍历)
- Java中final变量为什么在使用前必须要进行初始化
- Android开发常用权限和依赖
- java策略模式
- JavaScript 学习笔记 (2)
- 基于Vector实现适配器stack(顺序栈)
- RocketMQ源码解析-PushConsumer(1)
- 欢迎使用CSDN-markdown编辑器
- CentOS更改yum源与更新系统 ,安装软件
- 纪念碑谷附录八(夜曲)
- python3写excel
- 用VideoView播放视频出现Can't play this video原因
- react-native 初次编译遇到的问题
- Spring读取xml配置文件的原理与实现