简介:

限定仅在表尾进行插入或删除操作的线性表
表尾端称为栈顶(top),表头端称为栈底(bottom)

特点:

在栈中,后入栈的元素先出栈

C语言版本

用于测试的文件,以及测试结果可以去作者GitHub上查看

(下面代码只是最初实现,后续如果有修改,由于太麻烦,不会再更改下文,仅仅更新Github上的代码文件)

具体实现:

#define StackDataType int
#define InitStackData 12345 class StackNode {
public:
StackNode() {
data = InitStackData;
next = nullptr;
} StackNode(StackDataType ele) : data(ele), next(nullptr) { } StackDataType data;
StackNode *next;
}; // 栈(链式,长度)
class Stack {
public:
Stack();
Stack(int len); // 创建一个有着len个栈元素的栈
~Stack(); // 栈的初始化
void StackInit(); // 销毁栈
void StackDestroy(); // 将栈清空
void StackClear(); // 判断是否为空栈
bool StackEmpty(); // 获取栈长度,即栈中元素个数
int StackLength(); // 获取栈顶元素保存的数据值
bool StackGetTop(StackDataType &value); // 压栈,插入新的栈顶元素
bool StackPush(StackDataType value); // 出栈,删除栈顶元素
bool StackPop();
bool StackPop(StackDataType &value); // 出栈并返回其值 // 遍历栈,从栈底到栈顶
void StackTraverse(); private:
StackNode *top; // 表尾 栈顶
StackNode *bottom; // 表头 栈底
};
Stack::Stack()
{
StackInit();
} Stack::Stack(int len)
{
StackInit();
StackDataType tempdata = InitStackData; for (int i = ; i < len; i++) {
std::cin >> tempdata;
StackPush(tempdata);
}
} Stack::~Stack()
{
StackClear();
StackDestroy();
} void Stack::StackInit()
{
StackNode *temp = new(std::nothrow) StackNode; if (temp == ) {
std::exit();
} top = temp;
bottom = temp;
} void Stack::StackDestroy()
{
delete(bottom);
} void Stack::StackClear()
{
if (bottom == top) { // 已经是空栈
return;
} StackNode *cur = bottom->next;
StackNode *next = cur->next; while (cur != nullptr) { // 释放栈元素结点空间
delete(cur); if (next == nullptr) {
break;
} cur = next;
next = next->next;
} top = bottom;
} bool Stack::StackEmpty()
{
return (bottom == top) ? true : false;
} int Stack::StackLength()
{
int cnt = ;
StackNode *cur = bottom; while (cur != top) {
cnt++;
cur = cur->next;
} return cnt;
} bool Stack::StackGetTop(StackDataType &value)
{
if (bottom == top)
return false; // 空栈无栈顶元素 value = top->data; return true;
} bool Stack::StackPush(StackDataType value)
{
StackNode *temp = new(std::nothrow) StackNode(value); if (temp == ) {
return false;
} top->next = temp;
top = temp; return true;
} bool Stack::StackPop()
{
if (top == bottom) // 空栈无栈顶元素,无法pop
return false; StackNode *prior = bottom; while (prior->next != top) { // 找到栈顶第二个元素
prior = prior->next;
} delete(top);
top = prior;
top->next = nullptr; // 注意此处 return true;
} bool Stack::StackPop(StackDataType &value)
{
if (top == bottom) // 空栈无栈顶元素,无法pop
return false; StackNode *prior = bottom; while (prior->next != top) { // 找到栈顶第二个元素
prior = prior->next;
} value = top->data;
delete(top);
top = prior;
top->next = nullptr; // 注意此处 return true;
} void Stack::StackTraverse()
{
StackNode *cur = bottom->next; while (cur != top) {
std::cout << cur->data << std::endl;
cur = cur->next;
} std::cout << top->data << std::endl;
}

栈(C++)的更多相关文章

  1. 通往全栈工程师的捷径 —— react

    腾讯Bugly特约作者: 左明 首先,我们来看看 React 在世界范围的热度趋势,下图是关键词“房价”和 “React” 在 Google Trends 上的搜索量对比,蓝色的是 React,红色的 ...

  2. Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)

    --reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...

  3. duang~免费的学习视频来啦:学霸君之全栈测试

    学霸君向童鞋们推荐一款 同名学霸学习 视频教程 重点是完全免费收看学习噢!!! 今天 学霸君推荐腾讯课堂的学霸君之全栈测试 复制下方链接至腾讯课堂中报名学习 https://ke.qq.com/cou ...

  4. [数据结构]——链表(list)、队列(queue)和栈(stack)

    在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...

  5. BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 8748  Solved: 3835[Submi ...

  6. BZOJ 4453: cys就是要拿英魂![后缀数组 ST表 单调栈类似物]

    4453: cys就是要拿英魂! Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 90  Solved: 46[Submit][Status][Discu ...

  7. BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2326  Solved: 1054[Submit][Status ...

  8. .NET全栈开发工程师学习路径

    PS:最近一直反复地看博客园以前发布的一条.NET全栈开发工程师的招聘启事,觉得这是我看过最有创意也最朴实的一个招聘启事,更为重要的是它更像是一个技术提纲,能够指引我们的学习和提升,现在转载过来与各位 ...

  9. Nodejs之MEAN栈开发(八)---- 用户认证与会话管理详解

    用户认证与会话管理基本上是每个网站必备的一个功能.在Asp.net下做的比较多,大体的思路都是先根据用户提供的用户名和密码到数据库找到用户信息,然后校验,校验成功之后记住用户的姓名和相关信息,这个信息 ...

  10. 匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置

    0x00 前言: 匹夫在日常和别人交流的时候,常常会发现一旦讨论涉及到“类型”,话题的热度就会立马升温,因为很多似是而非.或者片面的概念常常被人们当做是全面和正确的答案.加之最近在园子看到有人翻译的& ...

随机推荐

  1. Xcode 真机调试报错:This application's application-identifier entitleme

        This application's application-identifier entitlement does not match that of the installed appli ...

  2. 序列统计(bzoj 4403)

    Description 给定三个正整数N.L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量.输出答案对10^6+3取模的结果. Input 输入第一行包含一个整数T,表示数据组 ...

  3. Mysql存储过程给变量赋值的几种方法实践

    BEGIN DECLARE v_request_count INT; #申请次数 DECLARE v_plan_count INT; #安排次数 DECLARE v_learn_count INT; ...

  4. Xor路

    Xor路 (xor.pas/c/cpp)128MB1s 给定一棵有N个点和N-1条边的树,请你求出树中的最长路径,以及总共有多少条最长路径. 这里路径长度是用xor定义的,即若经过的边的权值为a1, ...

  5. HTTP 错误 401.2 - Unauthorized

    最近开始拾起Asp.net方面的知识,遇到如下这个问题 HTTP 错误 401.2 - Unauthorized 由于身份验证头无效,您无权查看此页. 解决方法: >IIS管理 >功能视图 ...

  6. CentOS下Samba使用

    1. 软件 Samba需要以下三个基本软件包,相关依赖包未列出 samba: The Samba SMB server samba-client: Samba (SMB) client program ...

  7. LeetCode OJ-- Add Binary

    https://oj.leetcode.com/problems/add-binary/ 对两个二进制字符串求和. 对于字符串 ans_str,求它的翻转. reverse(ans_str.begin ...

  8. 怎样录制简单GIF动图

    看到视频里的精彩画面,想用动图的形式保存下来,应该如何录制呢,今天就介绍一款小巧实用,操作简单的软件,GifCam 2.0 汉化绿色版.相比其它的录制软件,它是免费无水印又可以在线录制的. 本来学习一 ...

  9. 如何在CentOS 7上安装Nginx

    第一步 - 添加Nginx存储库要添加CentOS 7 EPEL仓库,请打开终端并使用以下命令: sudo yum install epel-release第二步 - 安装Nginx现在Nginx存储 ...

  10. Oracle并发控制、事务管理学习笔记

    (a)基本概念 锁的2种最基本.最简单的类型:排他锁(eXclusive lock,即X锁).共享锁(Share lock,即S锁). 不同级别的锁定协议及其作用: 申请的锁 及其作用 锁定协议 修改 ...