栈(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 前言: 匹夫在日常和别人交流的时候,常常会发现一旦讨论涉及到“类型”,话题的热度就会立马升温,因为很多似是而非.或者片面的概念常常被人们当做是全面和正确的答案.加之最近在园子看到有人翻译的& ...
随机推荐
- 2017最好的JavaScript框架、库和工具 — SitePoint
与开发者数量相比,可能有更多的JavaScript框架.库和工具.截止到2017年5月,在GitHub上快速搜索能搜到超过110万的JavaScript项目. 在npmjs上有50万的可用包,并且这些 ...
- 【git】把本地项目和远程git仓库相连通
1. 打开在你的项目文件夹,输入下面的命令 git init 输完上面的命令,文件夹中会出现一个.git文件夹,如下图所示,其他的的文件也会出现蓝色小问号的标志 2. 添加所有文件 git add . ...
- DBus介绍
1. 介绍 DBus是一种桌面环境的进程间通讯(IPC)机制,有低时延.低消耗等优点 基于socket,提供了一对一的对等通讯:使用dbus-daemon作为后台进程时,可实现多对多通讯 由如下三个层 ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---47
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- NYOJ 27.水池数目-DFS求连通块
水池数目 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地 ...
- ByteBuffer的介绍
转摘 有一个问题需要明确:为什么要使用bytebuffer,它比byte比起来有什么优点? 很简单:为了提高IO的效率.怎样提高的,这个还得google一下. 记住几个标志的含义:position[0 ...
- SQLite中特殊的INSERT语句
SQLite中特殊的INSERT语句 在SQLite中,INSERT是基本语句,用来向表中插入数据.但是当表中存在字段存在唯一.非空.检查.主键等约束时,插入的数据很容易和约束冲突,造成插入操作失 ...
- 【转】java:多网卡环境下获取MAC地址
http://blog.csdn.net/10km/article/details/78569962 JDK6以后 java.net.NetworkInterface提供了完整的方法用于获取网络设备信 ...
- Idea下Maven的使用
一.导入maven结构的web工程 (1)在Intellij IDEA中选择File->New->Project from Version Control->Subversion. ...
- 给力Mac下的思维整理软件,思维导图软件合辑
给力Mac下的思维整理软件,思维导图软件合辑 1.Mindjet MindManager for mac 10.0.211 经典的头脑风暴思维导图软件 最新破解Mindjet MindManager ...