简介:

限定仅在表尾进行插入或删除操作的线性表
表尾端称为栈顶(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. pat 甲级 1080. Graduate Admission (30)

    1080. Graduate Admission (30) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue It ...

  2. 生成静态页面方法 .NET

    原文发布时间为:2009-09-30 -- 来源于本人的百度文章 [由搬家工具导入] 采用模板法:【例子中的两个页面以及生成的页面均在同一个目录,自己可以去改】 模板Template.htm: < ...

  3. linux中的vi编辑器(一)

    1.在linux中如果两个用户都在打开一个文件进行编辑,那么文件最后将以最后保存的版本为主. 2.vi仅仅是一个文本编辑器,相当于windows中的记事本,vi的工作模式, 命令模式:在该模式下,在键 ...

  4. [LeetCode] Find Minimum in Rotated Sorted Array 二分搜索

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  5. javascript 表格隔行换色

    用到的知识点: 获取表格元素 tbody 和 rows都是有索引的 这里我们只有一组tbody所以 索引是0 偶数行 索引取余2为0 奇数行 索引取余2不为0 通过 遍历行索引设置相应的颜色. < ...

  6. java通过读取本地文件获取反射方法参数,执行对象方法

    运用到的知识点 IO流, 集合properties   反射 在工程目录下新建file   config.properties #one time only can run one method cl ...

  7. LeetCode OJ-- Text Justification

    https://oj.leetcode.com/problems/text-justification/ 细节题 class Solution { public: vector<string&g ...

  8. jquery 中的post和get方法同步问题

    解决方法: 在需要同步的js代码前修改ajax的async属性. 有两种设置方法: 1: $.ajaxSettings.async = false; 2: $.ajaxSetup({ async : ...

  9. 洛谷 P1618 三连击(升级版)【DFS/next_permutation()/技巧性枚举/sprintf】

    [链接]:https://www.luogu.org/problemnew/show/P1618 题目描述 将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试 ...

  10. 【强连通分量】 Kosaraju和Tarjan算法 (标准模板+详细注释)

    codevs 题意:求最大强连通分量的大小以及所包含的顶点有哪些 Tarjan算法 #include<iostream> #include<queue> #include< ...