简介:

限定仅在表尾进行插入或删除操作的线性表
表尾端称为栈顶(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. HDOJ 1398 Square Coins

    Square Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  2. TCMalloc小记【转】

    转自:http://blog.csdn.net/chosen0ne/article/details/9338591 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 一 原理 二 ...

  3. JS与jquery书写插件规范

    什么是封装呢? 我的理解就是 把一个功能单独做成一个组件,就像做饺子,以前做饺子必须自己先用面粉做饺子皮,再做饺子馅,然后再手工包饺子,但是现在人们发明了自动包饺子机器,虽然机器里面的每一步骤和你自己 ...

  4. HDU5006 Resistance(高斯消元)

    给你一个复杂的网路图,然后告诉你s,t,求s,t的等效电阻.方法是设s的电势为1,t的电势为0.然后对于其它的每个点x,满足的是sigma(ux-uy)/R(x,y)(即对每个与x相连的节点y,电势差 ...

  5. hdu 4858(简单模拟)

    项目管理 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  6. Guava源码学习(零)前言

    Guava是由Google出品的Java类库,功能强大且易用. 后续我会用多篇博客介绍Guava的使用方法,以及从源码层面分析其实现原理. 分析次序基于Guava的官方Wiki 基于版本:Guava ...

  7. Codeforces Gym100971 L.Chess Match (IX Samara Regional Intercollegiate Programming Contest Russia, Samara, March 13)

    这个题就是两个队,看最多能赢的个数,然后比较一下,看两个队是都能赢彼此,还是只有一个队赢的可能性最大.表达能力不好,意思差不多... 和田忌赛马有点像,emnnn,嗯. 代码: 1 #include& ...

  8. 长安大学第四届“迎新杯”程序设计竞赛 F 打铁的箱子【数学/进制思维/折半枚举】

    题目描述 作为彩虹岛上最擅长打铁的人,

  9. HDU 1005 Number Sequence【斐波那契数列/循环节找规律/矩阵快速幂/求(A * f(n - 1) + B * f(n - 2)) mod 7】

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  10. BitMap与RoaringBitmap、JavaEWAH

    本文主要介绍BitMap的算法思想,以及开源工具类JavaEWAH.RoaringBitmap的简单用法. 一.BitMap 介绍 BitMap使用bit位,来标记元素对应的Value.该算法能够节省 ...