C++ 栈(stack)模拟实现(千字详细教程)(附源码)
创作时间:
作者:
@小白创作中心
C++ 栈(stack)模拟实现(千字详细教程)(附源码)
引用
CSDN
1.
https://blog.csdn.net/input_me/article/details/139970788
栈(stack)是计算机科学中一种重要的数据结构,广泛应用于函数调用、表达式求值等场景。本文将详细介绍如何使用C++单链表来模拟实现栈的基本功能,包括元素的压栈、弹栈、查看栈顶元素等操作。
栈简介
栈是一种后入先出(LIFO)的数据结构,就像一叠盘子,最后放进去的盘子总是最先被取出来。在C++中,虽然标准库提供了<stack>头文件来实现栈,但为了更好地理解栈的工作原理,本文将使用单链表来模拟实现栈。
栈的实现
环境配置
本实现基于VS2022,C++标准为C++20。
单链表节点设计
为了使栈能够存储不同类型的数据,我们将使用C++的模板特性。定义一个泛型节点结构体:
template <typename T>
struct node {
T data; // 存储的数据
node<T>* last; // 指向上一个节点的指针
};
栈类设计
栈类需要实现以下功能:
size():返回栈中元素的数量empty():检查栈是否为空top():返回栈顶元素push():向栈顶添加元素pop():从栈顶删除元素
栈类框架
template <typename T>
class stack {
public:
stack() {
s = 0;
t = nullptr;
}
~stack();
T push(T& type);
T pop();
T top();
int size();
bool empty();
private:
int s; // 元素数量
node<T>* t; // 栈顶指针
};
方法实现
size()和empty()实现
inline int size() {
return s;
}
inline bool empty() {
return s == 0;
}
top()实现
inline T top() {
return t->data;
}
push()实现
T push(T type) {
node<T>* n = new node<T>;
n->last = t;
n->data = type;
t = n;
s++;
return type;
}
pop()实现
T pop() {
node<T>* d = t;
t = d->last;
T type = d->data;
delete d;
d = nullptr;
s--;
return type;
}
- 析构函数实现
~stack() {
while (!empty())
pop();
}
完整代码
将上述代码整合到一个头文件stack.h中:
#pragma once
namespace std {
template <typename T>
struct node {
public:
T data;
node<T>* last;
};
template <typename T>
class stack {
public:
stack() {
s = 0;
t = nullptr;
}
~stack() {
while (!empty())
pop();
}
T push(T type) {
node<T>* n = new node<T>;
n->last = t;
n->data = type;
t = n;
s++;
return type;
}
T pop() {
node<T>* d = t;
t = d->last;
T type = d->data;
delete d;
d = nullptr;
s--;
return type;
}
inline T top() {
return t->data;
}
inline int size() {
return s;
}
inline bool empty() {
return s == 0;
}
private:
int s;
node<T>* t;
};
}
测试代码
#include <cstdio>
#include "stack.h"
int main() {
std::stack<int> mystack;
mystack.push(1);
mystack.push(2);
mystack.push(3);
mystack.push(4);
if (mystack.empty())
printf("empty\n");
else
printf("not empty\n");
printf("%d\n", mystack.pop());
printf("%d\n", mystack.top());
mystack.pop();
mystack.pop();
printf("%d\n", mystack.size());
}
测试结果:
not empty
4
3
1
完全符合预期!
热门推荐
网店价格欺诈:如何识别、应对与法律维权
如何为仓库选择最佳 LED 灯
宝宝的DHA食谱:哪些食物是DHA的优质来源
郑州居民医保住院报销比例怎么算
在职证明需要哪些材料?
在职证明和工作证明有何区别
垃圾箱房实现精品改造,让居民便捷生活更有实感
垃圾分类知识大全,快来收藏~
强基计划深度解析:就业前景、优缺点及适合考生类型
南京这些景点将免费开放,具体日期公布!
中性粒细胞百分比偏低是什么意思
海因里希事故法则:工业安全的金科玉律
艾司奥美拉唑镁与奥美拉唑的区别有什么
十大最流行的男士发型 男生发型推荐 男生剪什么发型好看
高效液相色谱法(HPLC)在药物杂质分析中的应用
南开区、河西区及河东区初中转学政策及刚需购房建议
《哪吒2》:哪吒与敖丙友情建立的历程
上海新添两处特色口袋公园,一园尽览中草药文化,一园穿越百年时光
马斯克官宣!最强AI出现了?对此DeepSeek做出了回复……
摄影测量在地形图测绘中的应用优势探析
学摄影测量与遥感技术可以找什么工作?
cd元素是什么(镉的基本介绍,镉的发现及行业发展)
网盘离线下载,让文件传输更便捷
Win11系统完整备份和还原:简单有效备份和恢复方法
乳牙根管治疗有必要吗?小孩子没换牙做根管治疗有没有什么不好的影响
人机协作系统的设计和优化
中国空间站将迎首位外籍航天员
窦性心动过缓伴不齐严重吗?专业医生为您详细解析
志愿者张旭阳:在基层一线书写别样精彩人生
上班族八字命理:揭秘职场运势与人生方向