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
完全符合预期!
热门推荐
香港噪音投诉指南:四大噪音来源及有效投诉方法
大数据分析在智慧园区管理中的应用
股票盘口的分析要点是什么?这些要点如何辅助投资决策?
可乐排骨的做法步骤,这样做软糯入味,咸甜适中
2026年美加墨世界杯亚洲区预选赛:国足前景分析及赛程一览
白细胞和淋巴细胞偏低是什么原因
从M110到M110A2 CBS:美国203mm自行火炮的发展历程
电脑总是自动重启怎么回事?5个步骤逐一排查,帮你轻松解决!
与国外企业签订中文合同有效吗?
中国男篮二十大中锋排行榜:姚明第一,穆铁柱位列第二
细菌性胸膜炎和结核性胸膜炎怎么办
配置RAID 5服务器系统时硬盘需要满足哪些条件?
聚氨酯是什么材料?
银行纷纷下调信用卡最低还款额比例至5%,对信用卡持卡人、银行不良率有何影响?
IT行业项目经理简历怎么写
东野圭吾创作生涯的重要转折点!
周日 意甲 亚特兰大VS国际米兰,比赛分析
茧与鸡眼的区别是什么和治疗
胶片:光影化学的永恒诗篇
胶卷相机怎么用?胶卷相机怎么装胶卷?
复旦大学附属华山医院团队在烟雾血管病治疗领域取得重要突破
《三角洲行动》"黑鹰坠落"战役上线,游戏品质再上新台阶
执业药师堪比铁饭碗,职业稳定与挑战并存!
如何找到满足需求的居住场所?这种找到如何考虑社区设施?
肋骨拉伤多久能好?医生的专业解答来了
肋骨周边肌肉痉挛的5种治疗方法
儿童支气管炎怎么调理
美海军遭遇"二战后最激烈海战":胡塞武装如何从游击队变身高精尖作战力量?
银行的智能投顾服务的算法优化与性能提升?
百家姓之97—和姓,起源·迁徙·家训·名人故事