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
完全符合预期!
热门推荐
从谐音到故事:联想记忆法让单词学习更高效
巧用联想记忆法,单词卡片让英语学习效率翻倍
失恋一周瘦20斤,揭秘情感低谷中的意外减肥
氩气输送软管:气体传输的安全性与稳定性
高纯氩气的特性和应用
从基础到实践:企业心理健康培训完整指南
空腹血糖正常值是多少
重庆西站周边游:22只大熊猫、千年古镇、梦幻夜景等你来
重庆西站周边三大景点全攻略:磁器口古镇、歌乐山、动物园
重庆至阿坝州旅游全攻略:动车直达,畅游九寨沟、黄龙
专家解析:中年夫妻失去兴趣的真相与破解之道
低血糖的症状怎么检查
杭州机场推免费洗漱服务,17间淋浴房配齐7类用品
用Midjourney AI制作炫酷微信红包封面
牛皮癣患者的土豆食疗指南
景军皮肤康复网发布牛皮癣新疗法,为患者带来新希望
牛皮癣的这些早期信号,你可能忽视了!
教育部要求:教师普通话需达二级乙等,这些提升方法最实用
膝盖疼痛,滑膜炎,根本蹲不下去?中医送你一个经验方,让膝盖更有劲!
普通话水平测试助力职业发展,北京推普周掀起学习热潮
教育媒体等行业必备,普通话成职场人核心竞争力
碳纤维:轻质高强度材料,从航空航天到体育器材广泛应用
心脑血管病吃他汀类药物,出现这些表现,副作用已经明显
瑞舒伐他汀钙胶囊吃多了对身体伤害大吗
春运自驾出行必看:异地违章处理全攻略
股票期货除权息全攻略:从机制调整到实战策略
张家界名茶品种大揭秘:从云雾茶到莓茶
深度学习驱动语音识别技术突破,多领域应用前景广阔
青春期如何保持心理健康
亲子沟通技巧:告别“你信息”,学会“我信息”