栈(C++)
简介:
限定仅在表尾进行插入或删除操作的线性表
表尾端称为栈顶(top),表头端称为栈底(bottom)
特点:
在栈中,后入栈的元素先出栈
用于测试的文件,以及测试结果可以去作者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++)的更多相关文章
- 通往全栈工程师的捷径 —— react
腾讯Bugly特约作者: 左明 首先,我们来看看 React 在世界范围的热度趋势,下图是关键词“房价”和 “React” 在 Google Trends 上的搜索量对比,蓝色的是 React,红色的 ...
- Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)
--reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...
- duang~免费的学习视频来啦:学霸君之全栈测试
学霸君向童鞋们推荐一款 同名学霸学习 视频教程 重点是完全免费收看学习噢!!! 今天 学霸君推荐腾讯课堂的学霸君之全栈测试 复制下方链接至腾讯课堂中报名学习 https://ke.qq.com/cou ...
- [数据结构]——链表(list)、队列(queue)和栈(stack)
在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
- BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 8748 Solved: 3835[Submi ...
- BZOJ 4453: cys就是要拿英魂![后缀数组 ST表 单调栈类似物]
4453: cys就是要拿英魂! Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 90 Solved: 46[Submit][Status][Discu ...
- BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2326 Solved: 1054[Submit][Status ...
- .NET全栈开发工程师学习路径
PS:最近一直反复地看博客园以前发布的一条.NET全栈开发工程师的招聘启事,觉得这是我看过最有创意也最朴实的一个招聘启事,更为重要的是它更像是一个技术提纲,能够指引我们的学习和提升,现在转载过来与各位 ...
- Nodejs之MEAN栈开发(八)---- 用户认证与会话管理详解
用户认证与会话管理基本上是每个网站必备的一个功能.在Asp.net下做的比较多,大体的思路都是先根据用户提供的用户名和密码到数据库找到用户信息,然后校验,校验成功之后记住用户的姓名和相关信息,这个信息 ...
- 匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置
0x00 前言: 匹夫在日常和别人交流的时候,常常会发现一旦讨论涉及到“类型”,话题的热度就会立马升温,因为很多似是而非.或者片面的概念常常被人们当做是全面和正确的答案.加之最近在园子看到有人翻译的& ...
随机推荐
- IntelliJ IDEA如何导入Gradle项目
最近学习Gradle,本文来重点介绍一下,如何使用IntelliJ IDEA导入`Gradle项目的一种方法. 选择菜单栏的File->Open. 在打开的窗口选择对应Gradle项目的buil ...
- pat 团体天梯赛 L2-006. 树的遍历
L2-006. 树的遍历 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历 ...
- javascript实现htmlEncode与htmlDecode
原文发布时间为:2011-04-19 -- 来源于本人的百度文章 [由搬家工具导入] htmlencode with javascript function htmlEncode(html) { ...
- AtCoder Regular Contest 090 C D E F
C - Candies 题意 求左上角走到右下角最大的数字和. 思路 直接\(dp\) Code #include <bits/stdc++.h> #define maxn 110 usi ...
- poj 2796 Feel Good dp || 单调栈
题目链接 题意 对于一个长度为\(n\)的非负整数数列\(a_1,a_2,-,a_n\),求\(max_{1≤l≤r≤n}f(l,r)\), 其中 \[f(l,r)=min(a_l,a_{l+1},- ...
- eclipse在linux環境下安裝注意事项
文件如果安装在非home文件夹下必须为eclipse授权 sudo chmod -R 777 /usr/tools/eclipse
- Python Challenge 第十五关
第15关,题目是 whom? 有一张图片,是个日历.日历的年份是 1XX6,中间是被挖去的洞.然后图中1月26日被画了个圈,当天是星期一.右下角的二月小图中有29号,可以得知这是闰年.然后查看源代码. ...
- extern "C"解析
转自大牛的解析(非常具体详细)http://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html 我做个简单的标注方便以后自己查看: 在用C++ ...
- MapReduce编程模型及其在Hadoop上的实现
转自:https://www.zybuluo.com/frank-shaw/note/206604 MapReduce基本过程 关于MapReduce中数据流的传输过程,下图是一个经典演示: 关于上 ...
- 为Zepto添加Slide动画效果
一.缘由 公司的移动端项目,采用zepto为主要框架,但是zepto毕竟是精简版的jquery,体积小了,功能自然没有这么强大,特别是动画和选择器这两块,需要我们自己去拓展. 在项目开发过程中,很多页 ...