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

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

栈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. 2023牛客寒假算法基础集训营2 ABCDEFHJKL

    比赛链接 A 题解 知识点:数学. 用 \(n\) 减去区间1的端点得到匹配的一个区间,求一下与区间2的交集. 一个小公式,两区间 \([L_1,R_1]\) 和 \([L_2,R_2]\) 的交集长 ...

  2. LeetCode-343. 整数拆分 - 题解分析

    题目来源 343. 整数拆分 题目详情 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化. 返回 你可以获得的最大乘积 . 示例 1: 输入: ...

  3. 深入Typescript--03-Typescript中的类(努力加餐饭)

    Typescript中的类 一.TS中定义类 class Pointer{ x!:number; // 实例上的属性必须先声明 y!:number; constructor(x:number,y?:n ...

  4. [Codeforces Round #816 (Div. 2)] D. 2+ doors

    这次Div.2比之前我打的有些要难啊,前三道题就耗了好多时间,D题干脆摆烂了... 还是太逊了 对于一个\(x\),有\(x|y_i=z_i\),那么我们设\(num[x]=z_1\)&\(z ...

  5. css之transform属性的使用

    1.定义:Transform属性应用于元素的2D或3D转换.这个属性允许你将元素旋转,缩放,移动,倾斜等. 2.常用的属性值: (1)translate(移动):   这个属性值里面含有三个参数,依次 ...

  6. FreeBSD 安装 fcitx5的配置

    link: Chinese Pinyin Package for typing Chinese sudo pkg install -y zh-CJKUnifonts sudo pkg install ...

  7. Servlet HTTP Request Response笔记

    # 今日内容:    1. Servlet    2. HTTP协议    3. Request## Servlet:    1. 概念    2. 步骤    3. 执行原理    4. 生命周期  ...

  8. 爬取精美壁纸5w张,爱了爱了

    近日接到一个需求--爬取某应用商店所有在线销售壁纸,这个任务起初让我惊呆了.因为上级没有给我解决风控问题,若爬取在售资源被人家厂商追责怎么办?若造成人家服务器出问题怎么办?问的时候上级含糊其辞,唉!其 ...

  9. Spark系列 - (3) Spark SQL

    3. Spark SQL 3.1 Hive.Shark和Sparksql Hive:Hadoop刚开始出来的时候,使用的是hadoop自带的分布式计算系统 MapReduce,但是MapReduce的 ...

  10. 开源分布式任务调度系统就选:DolphinScheduler

    分布式任务调度这个话题是每个后端开发和大数据开发都会接触的话题.因为应用场景的广泛,所以有很多开源项目专注于解决这类问题,比如我们熟知的xxl-job. 那么今天要给大家推荐的则是另一个更为强大的开源 ...