【Weiss】【第03章】栈例程

本文通过C++代码展示了如何使用数组实现栈的基本操作,包括入栈、获取长度、获取头元素、出栈和清空栈。通过具体实例帮助读者理解栈的数据结构及其在编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写栈比队列更简单一些,毕竟只有一个数据出入口。

之前用C在程序里模拟栈代替递归的时候,直接搞个数组来实现都是非常轻松愉快的事情。

不多说,放代码。

 

测试代码

 1 #include <iostream>
 2 #include "stack.h"
 3 using namespace std;
 4 using namespace stack;
 5 template class Stack<int>;
 6 int main(void)
 7 {
 8     Stack<int> number;
 9 
10     //测试入栈
11     cout << "/*additem()*/" << endl;
12     number.push(2);
13     number.push(3);
14     number.push(5);
15     number.push(7);
16     number.push(11);
17     number.traverse();
18     cout << "\n/*end*/\n\n" << flush;
19 
20     //测试获取长度
21     cout << "/*length()*/" << endl;
22     cout << number.size() << endl;
23     cout << "/*end*/\n\n" << flush;
24 
25     //测试获得头元素
26     cout << "/*getfirst()*/" << endl;
27     cout << number.getfirst() << endl;
28     cout << "/*end*/\n\n" << flush;
29 
30     //测试出栈
31     cout << "/*remove()*/" << endl;
32     number.pop();
33     number.pop();
34     number.traverse();
35     cout << "\n/*end*/\n\n" << flush;
36 
37     //测试清空,并测试从空表中出栈
38     cout << "/*clear(),remove()*/" << endl;
39     number.clear();
40     number.pop();
41     cout << "/*end*/\n\n" << flush;
42 
43     system("pause");
44 }
View Code

 

 

 

主体代码

  1 #ifndef STACK
  2 #define STACK
  3 #include <iostream>
  4 using namespace std;
  5 
  6 namespace stack
  7 {
  8 
  9 //节点模板
 10 template <typename T> struct Node
 11 {
 12     Node<T>() : next(nullptr){}
 13     Node<T>(const T &item, Node<T>* ptr = nullptr) : data(item), next(ptr){}
 14     T data;
 15     Node<T>* next;
 16 };
 17 //头节点及主体操作
 18 template <typename T> class Stack
 19 {
 20 //构造函数
 21 public:
 22     Stack<T>() : length(0), front(nullptr){}
 23 //接口
 24 public:
 25     //返回长度
 26     unsigned int size()const{ return length; }
 27     //返回头指针
 28     Node<T>* begin()const{ return front; }
 29     //判断是否为空
 30     bool empty()const{ return length == 0; }
 31     //获得头元素
 32     T getfirst()const{ return front->data; }
 33     //#查找元素所在地址
 34     Node<T>* find(const T &item)const;
 35     //#入栈
 36     bool push(const T &item);
 37     //#出栈
 38     bool pop();
 39     //#遍历并输栈元素
 40     void traverse()const;
 41     //#清空栈
 42     void clear();
 43 
 44 //辅助函数
 45 private:
 46     //#查找元素前驱
 47     Node<T>* find_prev(const T& item)const;
 48 //数据
 49 private:
 50     unsigned int length;
 51     Node<T>* front;
 52 };
 53 
 54 //如果元素为头元素或元素不存在则返回nullptr,否则返回前驱
 55 template <typename T> Node<T>* Stack<T>::find_prev(const T& item)const
 56 {
 57     if (length == 0)
 58         return nullptr;
 59     if (front->data == item)
 60         return nullptr;
 61     for (Node<T>* iter = front; iter->next != nullptr; iter = iter->next)
 62     {
 63         if (iter->next->data == item)
 64             return iter;
 65     }
 66     return nullptr;
 67 }
 68 //调用find_prev,如果元素存在则返回地址,不存在则返回nullptr
 69 template <typename T> Node<T>* Stack<T>::find(const T &item)const
 70 {
 71     Node<T>* iter = find_prev(item);
 72     if (length == 0)
 73         return nullptr;
 74     if (front->data == item)
 75         return front;
 76     return iter->next;
 77 }
 78 template <typename T> bool Stack<T>::push(const T &item)
 79 {
 80     Node<T>* pnew = new Node<T>(item);
 81     pnew->next = front;
 82     front = pnew;
 83     ++length;
 84     return true;
 85 }
 86 template <typename T> bool Stack<T>::pop()
 87 {
 88     if (length == 0)                    
 89     {
 90         cout << "No data!" << endl;
 91         return false;
 92     }
 93     Node<T>* save = front;
 94     front = front->next;
 95     delete save;
 96     --length;
 97     return true;
 98 }
 99 template <typename T> void Stack<T>::traverse()const
100 {
101     if (length != 0)
102     {
103         for (Node<T>* iter = front; iter != nullptr; iter = iter->next)
104             cout << iter->data << ends;
105     }
106 }
107 template <typename T> void Stack<T>::clear()
108 {
109     Node<T>* iter;
110     while (front != nullptr)
111     {
112         iter = front;
113         front = front->next;
114         delete iter;
115     }
116     front = nullptr;
117     length = 0;
118 }
119 }
120 #endif

 

转载于:https://www.cnblogs.com/catnip/p/4328892.html

内容概要:该论文研究增程式电动汽车(REEV)的能量管理策略,针对现有优化策略实时性差的问题,提出基于工况识别的自适应等效燃油消耗最小策略(A-ECMS)。首先建立整车Simulink模型和基于规则的策略;然后研究动态规划(DP)算法和等效燃油最小策略;接着通过聚类分析将道路工况分为四类,并设计工况识别算法;最后开发基于工况识别的A-ECMS,通过高德地图预判工况类型并自适应调整SOC分配。仿真显示该策略比规则策略节油8%,比简单SOC规划策略节油2%,并通过硬件在环实验验证了实时可行性。 适合人群:具备一定编程基础,特别是对电动汽车能量管理策略有兴趣的研发人员和技术爱好者。 使用场景及目标:①理解增程式电动汽车能量管理策略的基本原理;②掌握动态规划算法和等效燃油消耗最小策略的应用;③学习工况识别算法的设计和实现;④了解基于工况识别的A-ECMS策略的具体实现及其优化效果。 其他说明:此资源不仅提供了详细的MATLAB/Simulink代码实现,还深入分析了各算法的原理和应用场景,适合用于学术研究和工业实践。在学习过程中,建议结合代码调试和实际数据进行实践,以便更好地理解策略的优化效果。此外,论文还探讨了未来的研究方向,如深度学习替代聚类、多目标优化以及V2X集成等,为后续研究提供了思路。
内容概要:论文《基于KANN-DBSCAN带宽优化的核密度估计载荷谱外推》针对传统核密度估计(KDE)载荷外推中使用全局固定带宽的局限性,提出了一种基于改进的K平均最近邻DBSCAN(KANN-DBSCAN)聚类算法优化带宽选择的核密度估计方法。该方法通过对载荷数据进行KANN-DBSCAN聚类分组,采用拇指法(ROT)计算各簇最优带宽,再进行核密度估计和蒙特卡洛模拟外推。实验以电动汽车实测载荷数据为对象,通过统计参数、拟合度和伪损伤三个指标验证了该方法的有效性,误差显著降低,拟合度R²>0.99,伪损伤接近1。 适合人群:具备一定编程基础和载荷数据分析经验的研究人员、工程师,尤其是从事汽车工程、机械工程等领域的工作1-5年研发人员。 使用场景及目标:①用于电动汽车载荷谱编制,提高载荷预测的准确性;②应用于机械零部件的载荷外推,特别是非对称载荷分布和多峰扭矩载荷;③实现智能网联汽车载荷预测与数字孪生集成,提供动态更新的载荷预测系统。 其他说明:该方法不仅解决了传统KDE方法在复杂工况下的“过平滑”与“欠拟合”问题,还通过自适应参数机制提高了方法的普适性和计算效率。实际应用中,建议结合MATLAB代码实现,确保数据质量,优化参数并通过伪损伤误差等指标进行验证。此外,该方法可扩展至风电装备、航空结构健康监测等多个领域,未来研究方向包括高维载荷扩展、实时外推和多物理场耦合等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值