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
完全符合预期!
热门推荐
观测行为为何会导致“波函数坍缩”?答案或有助人类通向宇宙真理
重塑未来:60岁退休了可以找什么工作?揭秘中老年新职业机遇
HS编码错误会影响目的港清关吗?如何规避?
全志H616芯片性能解析:与RK3328和晶晨S905X3的对比分析
自尊:自我价值与能力的心灵灯塔
业主大会表决机制是怎样的?下列事项由业主共同决定
遗忘物和遗失物区别有哪些?
大家养老保险100%股权正式挂牌,寻找新东家,开启自救之路
如何解决扶老人被讹诈事件对社会信任的影响?
【技术闲聊】CPU缓存要过时了?未来这几种黑科技可能让它下岗!
劳动人事争议调解登记薄:法律框架与实际应用
起诉作为法律关系的构成:析其性质与意义
新员工自离7天索薪争议:从劳动法到数字化管控的深度拆解
与OpenAI合作受到隐私争议,苹果将如何处理共享数据?
纯碱的价格为什么降?纯碱价格下降的原因和市场反应是什么?
内向性格其实更具优势
心不舒服是怎么回事?
绿色餐饮与可持续发展:现状与未来展望
餐饮行业市场分析:现状与未来发展趋势
认知不匹配?你将如何面对生命中不可避免的苦难
明日方舟新角色伊内丝详解:神秘情报官的多重技能猜测
女生吃菠萝可以减肥吗
菠萝的功效与作用是什么?菠萝的功能和用途是什么?
防范诈骗,刻不容缓
房贷还清后个税专项扣除怎么办?操作步骤及替代方案全解析
熬中药泡多长时间效果最好
跆拳道培训中心的教学方法怎么样?
拉肚子可以吃什么面条
推荐4款安全又好用的跨网文件安全交换系统
脚踝感觉紧绷是什么原因