栈,一种遵循先进先出原则的数据结构,可以用顺序表实现,也可以用链表进行实现。

这里我使用数组实现方法,包含了进栈,出栈,访问栈顶等功能,以及一些辅助功能。

栈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) (课后作业版)的更多相关文章

  1. HDU 4612 Warm up(手动扩栈,求树上哪两个点的距离最远)

    题目大意: 给你一个无向图,问加一条边之后最少还剩下几座桥. (注意重边处理)   分析:其实当我们把边双连通分量给求出来之后我们就能将连通块求出来,这样我们就可以重新构图.重新构造出来的图肯定是一颗 ...

  2. [欧拉回路+手动开栈] poj 1780 Code

    题目链接: http://poj.org/problem? id=1780 Code Time Limit: 1000MS   Memory Limit: 65536K Total Submissio ...

  3. 【手动开栈】【dfs序】【树状数组】【Tarjan】bzoj2819 Nim

    考虑树状数组区间修改(只对其子树的答案有影响)点查询,每个点记录的是它到根路径上的权值异或和. 答案时query(L)^query(R)^a[lca]. 这种方法在支持区间加法.减法的树上询问的时候可 ...

  4. (深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)

    bss段: bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域. bss是英文Block Started by Symbol的简称. bss段属于静态内存分配. ...

  5. 【转】(深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)

    bss段: bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域. bss是英文Block Started by Symbol的简称. bss段属于静态内存分配. ...

  6. [二进制漏洞]栈(Stack)溢出漏洞 Linux篇

    目录 [二进制漏洞]栈(Stack)溢出漏洞 Linux篇 前言 堆栈 堆栈(Stack)概念 堆栈数据存储方式 函数调用 函数调用C语言代码 函数调用过程GDB调试 函数Call返回原理 函数栈帧 ...

  7. String字符串类课后作业

    String动手动脑和课后作业 请运行以下示例代码StringPool.java,查看其输出结果.如何解释这样的输出结果?从中你能总结出什么? 结果: 总结:在Java中,内容相同的字串常量(&quo ...

  8. BSS段 data段 text段 堆heap 和 栈stack

    BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配.   数 ...

  9. JAVA第三周课后作业

    JAVA课后作业 一.枚举类型 代码: enum Size{SMALL,MEDIUM,LARGE}; public cl ass EnumTest { public static void main( ...

  10. java课后作业

    课后作业之字串加密: 设计思想: 1.输入要加密的英文子串str 2.定义num=str的字符串长度 3.将字符串转化为单个字符 4.每个字符+3,向后移3个 5.定义str1,将新得到的每个字符加到 ...

随机推荐

  1. 【Basic Knowledge】Self-Attention Generative Adversarial Networks

    Note   这是一篇将Self-Attention应用到GAN中的paper,Self-Attention模块是卷积模块的补充,能够有助于建模跨图像区域的长范围.多层次依赖关系.文中主要提到4点: ...

  2. Ubuntu下的LGT8F328P MiniEVB Arduino开发和烧录环境

    基于 LGT8F328P LQFP32 的 Arduino MiniEVB, 这个板型资料较少, 记录一下开发环境和烧录过程以及当中遇到的问题. 关于 LGT8F328P 芯片参数 8位RISC内核 ...

  3. css边框,盒子模型、浮动、定位

    边框,盒子模型.浮动.定位 一.边框 border-width : 边框宽度 border-style : 边框样式 1.solid 实线 2.none 无边框 3.dotted 点状虚线边框 4.d ...

  4. 【大型软件开发】浅谈大型Qt软件开发(三)QtActive Server如何通过COM口传递自定义结构体?如何通过一个COM口来获得所有COM接口?

    前言 最近我们项目部的核心产品正在进行重构,然后又是年底了,除了开发工作之外项目并不紧急,加上加班时间混不够了....所以就忙里偷闲把整个项目的开发思路聊一下,以供参考. 鉴于接下来的一年我要进行这个 ...

  5. (一)Abp入门

    ABP 是用于创建现代Web应用程序的完整体系结构和强大的基础架构,遵循最佳实践和约定,为 您提供 SOLID 开发经验. 目前 ABP 的版本   ASP.NET Boilerplate ASP.N ...

  6. elasticsearch-head-master安装

    1 简介 elasticsearch-head是一款专门针对于elasticsearch的客户端工具,elasticsearch-head是一个基于node.js的前端工程 2 依赖 需要安装node ...

  7. windows环境下安装es和kibana

    1 ES安装 1.1 下载地址 https://www.elastic.co/cn/downloads/elasticsearch 1.2 版本选择 注意选择合适的版本,ES依赖于JDK,需要有对应的 ...

  8. eigen的简单用法汇总

    Eigen帮助文档的地址:http://eigen.tuxfamily.org/dox/pages.html Eigen的论坛:http://forum.kde.org/viewforum.php?f ...

  9. 美团点评CAT部署了各种环境不下10次,遇到的坑整理

    CAT是什么 我的理解是一个收集服务调用等运行情况的监控系统. 相信你能搜到这篇博客我就不多介绍了,这里有链接 传送门 本博客仅仅只帮助大家解决部署方面的问题 来自一个用户的吐槽 1.部署真他娘的困难 ...

  10. TCP/IP 协议(10):TCP 协议一百问

    TCP/IP 协议(10):TCP 协议一百问 杨领well 的 TCP/IP 协议专栏 TCP 协议部分一直没有更新,是因为我不确定到底应该怎么来介绍 TCP 协议才能干货满满.最后我决定以 Q&a ...