C++ 手动实现栈(stack) (课后作业版)
栈,一种遵循先进先出原则的数据结构,可以用顺序表实现,也可以用链表进行实现。
这里我使用数组实现方法,包含了进栈,出栈,访问栈顶等功能,以及一些辅助功能。
栈Stack类定义如下:
template <typename T>
class Stack {
public:
Stack();
Stack(int n);
Stack(Stack<T>& stack);
~Stack();
T& top();
Stack<T>& push(const T& elem);
Stack<T>& pop();
void reserve(int num);
int size() {return current+1; }
int capciaty() {return cap; }
int is_empty() {return current == -1; }
bool is_full() {return current == (cap-1); }
void clear() {this->~Stack();}
private:
T* arr;
int current;
int cap;
};
其中,成员变量的解释:
arr :数组指针,指向栈底
current : 当前栈顶的索引,没有元素的时候为-1, 有一个元素的时候为0, 以此类推
cap :数组容量,注意容量和元素个数是不同的概念
然后,是成员函数的解释:
Stack(); 默认构造函数
Stack(int n); 一般构造函数,容量为n
Stack(Stack<T>& stack); 拷贝构造函数,浅拷贝
~Stack(); 析构函数
T& top(); 访问栈顶
Stack<T>& push(const T& elem); 进栈
Stack<T>& pop(); 出栈
void reserve(int num); 增加容量
int size() {return current+1; } 获取当前元素个数
int capciaty() {return cap; } 获取容量
int is_empty() {return current == -1; } 是否为空栈
bool is_full() {return current == (cap-1); } 是否满栈
void clear() {this->~Stack();} 清除,调用析构函数
完成实现代码:
#include <iostream>
using namespace std;
template <typename T>
class Stack {
public:
Stack();
Stack(int n);
Stack(Stack<T>& stack);
~Stack();
T& top();
Stack<T>& push(const T& elem);
Stack<T>& pop();
void reserve(int num);
int size() {return current+1; }
int capciaty() {return cap; }
int is_empty() {return current == -1; }
bool is_full() {return current == (cap-1); }
void clear() {this->~Stack();}
private:
T* arr;
int current;
int cap;
};
//默认构造函数
template <typename T>
Stack<T>::Stack() {
cap = 0;
current = -1;
arr = nullptr;
}
//一般构造函数
template <typename T>
Stack<T>::Stack(int n) {
cap = n;
current = -1;
arr = new T[n]{};
}
//拷贝构造函数(前浅贝)
template <typename T>
Stack<T>::Stack(Stack<T>& stack) {
cap = stack.capciaty();
current = stack.size();
this->arr = stack.arr;
}
//析构函数
template <typename T>
Stack<T>::~Stack() {
if ( cap == 0 ) {
return;
}
cap = 0;
current = -1;
delete [] arr;
arr = nullptr;
}
//访问栈顶
template <typename T>
T& Stack<T>::top() {
if ( is_empty() ) {
cout << "[error]: stack has no element" << endl;
}
return *(arr+current);
}
//在栈顶添加一个元素
template <typename T>
Stack<T>& Stack<T>::push(const T& elem) {
if ( is_full() ) {
reserve(2*cap);
}
current++;
arr[current] = elem;
return *this;
}
//栈顶弹出
template <typename T>
Stack<T>& Stack<T>::pop() {
if ( is_empty() ) {
cout << "[error]: don't try to pop a empty stack" << endl;
return *this;
}
current--;
return *this;
}
//增加容量
template <typename T>
void Stack<T>::reserve(int num) {
if ( num < cap ) {
cout << "[warning]: input of reserve() function shuold lager than capciaty" << endl;
return;
}
T *arr_ = new T[num]{};
for ( int i = 0; i <= current; i++ )
arr_[i] = arr[i];
delete [] arr;
arr = arr_;
arr_ = nullptr;
cap = num;
}
int main() {
Stack<int> stack(3);
// cout << "top=" << stack.top() << ", 容量=" << stack.capciaty() << ", 元素个数=" << stack.size() << endl;
stack.push(3);
cout << "top=" << stack.top() << ", 容量=" << stack.capciaty() << ", 元素个数=" << stack.size() << endl;
stack.push(2);
cout << "top=" << stack.top() << ", 容量=" << stack.capciaty() << ", 元素个数=" << stack.size() << endl;
stack.push(5);
cout << "top=" << stack.top() << ", 容量=" << stack.capciaty() << ", 元素个数=" << stack.size() << endl;
stack.push(5);
cout << "top=" << stack.top() << ", 容量=" << stack.capciaty() << ", 元素个数=" << stack.size() << endl;
stack.pop();
cout << "top=" << stack.top() << ", 容量=" << stack.capciaty() << ", 元素个数=" << stack.size() << endl;
stack.clear();
cout << "top=" << stack.top() << ", 容量=" << stack.capciaty() << ", 元素个数=" << stack.size() << endl;
}
C++ 手动实现栈(stack) (课后作业版)的更多相关文章
- HDU 4612 Warm up(手动扩栈,求树上哪两个点的距离最远)
题目大意: 给你一个无向图,问加一条边之后最少还剩下几座桥. (注意重边处理) 分析:其实当我们把边双连通分量给求出来之后我们就能将连通块求出来,这样我们就可以重新构图.重新构造出来的图肯定是一颗 ...
- [欧拉回路+手动开栈] poj 1780 Code
题目链接: http://poj.org/problem? id=1780 Code Time Limit: 1000MS Memory Limit: 65536K Total Submissio ...
- 【手动开栈】【dfs序】【树状数组】【Tarjan】bzoj2819 Nim
考虑树状数组区间修改(只对其子树的答案有影响)点查询,每个点记录的是它到根路径上的权值异或和. 答案时query(L)^query(R)^a[lca]. 这种方法在支持区间加法.减法的树上询问的时候可 ...
- (深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)
bss段: bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域. bss是英文Block Started by Symbol的简称. bss段属于静态内存分配. ...
- 【转】(深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)
bss段: bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域. bss是英文Block Started by Symbol的简称. bss段属于静态内存分配. ...
- [二进制漏洞]栈(Stack)溢出漏洞 Linux篇
目录 [二进制漏洞]栈(Stack)溢出漏洞 Linux篇 前言 堆栈 堆栈(Stack)概念 堆栈数据存储方式 函数调用 函数调用C语言代码 函数调用过程GDB调试 函数Call返回原理 函数栈帧 ...
- String字符串类课后作业
String动手动脑和课后作业 请运行以下示例代码StringPool.java,查看其输出结果.如何解释这样的输出结果?从中你能总结出什么? 结果: 总结:在Java中,内容相同的字串常量(&quo ...
- BSS段 data段 text段 堆heap 和 栈stack
BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数 ...
- JAVA第三周课后作业
JAVA课后作业 一.枚举类型 代码: enum Size{SMALL,MEDIUM,LARGE}; public cl ass EnumTest { public static void main( ...
- java课后作业
课后作业之字串加密: 设计思想: 1.输入要加密的英文子串str 2.定义num=str的字符串长度 3.将字符串转化为单个字符 4.每个字符+3,向后移3个 5.定义str1,将新得到的每个字符加到 ...
随机推荐
- 【Basic Knowledge】Self-Attention Generative Adversarial Networks
Note 这是一篇将Self-Attention应用到GAN中的paper,Self-Attention模块是卷积模块的补充,能够有助于建模跨图像区域的长范围.多层次依赖关系.文中主要提到4点: ...
- Ubuntu下的LGT8F328P MiniEVB Arduino开发和烧录环境
基于 LGT8F328P LQFP32 的 Arduino MiniEVB, 这个板型资料较少, 记录一下开发环境和烧录过程以及当中遇到的问题. 关于 LGT8F328P 芯片参数 8位RISC内核 ...
- css边框,盒子模型、浮动、定位
边框,盒子模型.浮动.定位 一.边框 border-width : 边框宽度 border-style : 边框样式 1.solid 实线 2.none 无边框 3.dotted 点状虚线边框 4.d ...
- 【大型软件开发】浅谈大型Qt软件开发(三)QtActive Server如何通过COM口传递自定义结构体?如何通过一个COM口来获得所有COM接口?
前言 最近我们项目部的核心产品正在进行重构,然后又是年底了,除了开发工作之外项目并不紧急,加上加班时间混不够了....所以就忙里偷闲把整个项目的开发思路聊一下,以供参考. 鉴于接下来的一年我要进行这个 ...
- (一)Abp入门
ABP 是用于创建现代Web应用程序的完整体系结构和强大的基础架构,遵循最佳实践和约定,为 您提供 SOLID 开发经验. 目前 ABP 的版本 ASP.NET Boilerplate ASP.N ...
- elasticsearch-head-master安装
1 简介 elasticsearch-head是一款专门针对于elasticsearch的客户端工具,elasticsearch-head是一个基于node.js的前端工程 2 依赖 需要安装node ...
- windows环境下安装es和kibana
1 ES安装 1.1 下载地址 https://www.elastic.co/cn/downloads/elasticsearch 1.2 版本选择 注意选择合适的版本,ES依赖于JDK,需要有对应的 ...
- eigen的简单用法汇总
Eigen帮助文档的地址:http://eigen.tuxfamily.org/dox/pages.html Eigen的论坛:http://forum.kde.org/viewforum.php?f ...
- 美团点评CAT部署了各种环境不下10次,遇到的坑整理
CAT是什么 我的理解是一个收集服务调用等运行情况的监控系统. 相信你能搜到这篇博客我就不多介绍了,这里有链接 传送门 本博客仅仅只帮助大家解决部署方面的问题 来自一个用户的吐槽 1.部署真他娘的困难 ...
- TCP/IP 协议(10):TCP 协议一百问
TCP/IP 协议(10):TCP 协议一百问 杨领well 的 TCP/IP 协议专栏 TCP 协议部分一直没有更新,是因为我不确定到底应该怎么来介绍 TCP 协议才能干货满满.最后我决定以 Q&a ...