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

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

栈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. (17)go-micro微服务Prometheus监控

    目录 一 Prometheus监控介绍 1.微服务监控系统promethues介绍 2.微服务监控系统promethues工作流程 二 Prometheus监控重要组件和重要概念 1.微服务监控系统p ...

  2. 探究BrainSplit-集群脑裂

    本篇文章将会以redis集群为例,分享在主从集群中会导致数据丢失的一个问题:BrainSplit-集群脑裂 1.什么是集群脑裂 所谓的脑裂,就是指在主从集群中,同时有两个主节点,它们都能接收写请求.而 ...

  3. axios 使用方法 以及服务器端 设置拦截发送404状态的提示语,当网络错误时候返回前端的提示, 当网络正常的时候返回后端的提示

    本文旨在说明  设置全局异常拦截器 当网络错误时候返回前端的提示, 当网络正常的时候返回后端的提示 export default ({ development: { baseURL: 'http:// ...

  4. SQL分类-DDL_操作数据库_创建&查询

    SQL分类 1.DDL(Data Definition Language)数据定义语言 用来定义数据库对象:数据库,表,列等.关键字:create , drop, alter 等 2.DML(Data ...

  5. 用GC的策略,管理团队的技术债务

    在数字化时代,每一个组织的经营都是建立在数字化的系统之上的,而数字化系统的构建,必然就会带来技术债务,这是每一个数字化团队都要面临的一个问题,如何有效的管控技术债务. 技术债务的产生,是技术团队不断迭 ...

  6. 使用Kubernetes中的Nginx来改善第三方服务的可靠性和延迟

    使用Kubernetes中的Nginx来改善第三方服务的可靠性和延迟 译自:How we improved third-party availability and latency with Ngin ...

  7. C++_虚函数

    1.目的: 派生类继承自基类.使用指针或引用访问派生类对象时,指针或引用本身所指向的类型可以是基类而不是派生类.如果派生类覆盖了基类中的方法,通过上述指针或引用调用该方法时,可以有两种结果: 调用到基 ...

  8. 使用 DirectSound 录制麦克风音频

    使用 DirectSound 录制麦克风音频 本文所有代码均可在以下仓库找到 https://gitcode.net/PeaZomboss/learnaudios 目录是demo/dscapture ...

  9. javaweb画图

    最近都在忙期中考试,写博客的频率有点低了,以下是一些基本代码,是王建民老师说的要建立自己的资料库,我直接建的资料库. 画图html <!--定义表格宽度 行距 宽度<tr>行< ...

  10. Backbone 网络-ResNet 论文解读

    摘要 残差网络(ResNet)的提出是为了解决深度神经网络的"退化"(优化)问题. 有论文指出,神经网络越来越深的时候,反传回来的梯度之间的相关性会越来越差,最后接近白噪声.即更深 ...