C++语言模拟实现栈 类模板(Stack的基本操作)
小标 2018-06-25 来源 : 阅读 934 评论 0

摘要:本文主要向大家介绍了C++语言模拟实现栈 类模板,通过具体的代码向大家展示,希望对大家学习C++语言有所帮助。

本文主要向大家介绍了C++语言模拟实现栈 类模板,通过具体的代码向大家展示,希望对大家学习C++语言有所帮助。

// 坏境 win7  x64 vs2012

[cpp] view plain copy print?
1. #include <iostream>  
2. #include <cassert>  
3. using namespace std;  
4.   
5. template <typename T>  
6. class Stack  
7. {  
8. public:  
9.     // 构造函数  
10.     explicit Stack(const size_t capacity = 10)  
11.         :_size(0)  
12.         ,_capacity(10)  
13.     {  
14.         // 最小分配10个 大于10 则分配用户指定的大小  
15.         _capacity = (_capacity > capacity)? _capacity : capacity;  
16.         _array = new T[_capacity];  
17.     }  
18.   
19.     // 拷贝构造函数  
20.     explicit Stack(const Stack<T>&  s)  
21.     {  
22.         _array = new T[s._capacity];  
23.         _capacity = s._capacity;  
24.         _size = s._size;  
25.         for (size_t idx = 0; idx < _size; ++idx)  
26.         {  
27.             _array[idx] = s._array[idx];  
28.         }  
29.     }  
30.   
31.     // 赋值重载 简洁版本  
32.     Stack& operator=(const  Stack<T>& s)  
33.     {  
34.         if (this != &s)  
35.         {  
36.             Stack temp(s);  
37.             std::swap(_array, temp._array);  
38.             _size = s._size;  
39.             _capacity = s._capacity;  
40.         }  
41.         return *this;  
42.     }  
43.   
44.     // 获取当前栈顶  
45.     T& Top()const  
46.     {  
47.         assert(!Empty());  // 断言  
48.         return _array[_size -1];  
49.     }  
50.   
51.     // 获取栈当前元素  
52.     size_t Length()const   
53.     {  
54.         return _size;  
55.     }  
56. private:  
57.     // 检查容量是否满 满则扩充双倍   
58.     void CheckCapacity()  
59.     {  
60.         if (_size>=_capacity)  
61.         {  
62.             T* temp = new T[_capacity*2]; // 分配新的空间   
63.             for (int idx = 0; idx < _size; ++idx) // 拷贝原来的元素到心空间  
64.             {  
65.                 temp[idx] = _array[idx];  
66.             }  
67.             _array = temp;  
68.             _capacity *= 2;  
69.         }  
70.     }  
71. public:  
72.     // 压栈  
73.     void Push(const T& data)  
74.     {  
75.         // 插入数据时 检查是否已满  
76.         CheckCapacity();  
77.         _array[_size++] = data;  
78.     }  
79.   
80.     // 判空  
81.     bool Empty()const  
82.     {  
83.         return 0 == _size;  
84.     }  
85.   
86.     // 出栈 并将出栈的元素赋给data  
87.     bool Pop(T& data)  
88.     {  
89.         if (Empty())  
90.         {  
91.             return false;  
92.         }  
93.         else  
94.         {  
95.             data = _array[--_size];  
96.             return true;  
97.         }  
98.     }  
99.   
100.     // 析构函数  
101.     ~Stack()  
102.     {  
103.         if (NULL != _array)  
104.         {  
105.             delete[] _array;  
106.             _array = NULL;  
107.             _capacity = 0;  
108.             _size = 0;  
109.         }  
110.     }  
111.   
112. private:  
113.     T* _array; // 指向栈底  
114.     size_t _size; // 表示栈中元素个数  
115.     size_t _capacity; // 栈的容量  
116. };  
117.   
118. // 测试基本功能  
119. void Test()  
120. {  
121.     // 测试push  
122.     //  Stack<int> stack_test_push;  
123.     //  stack_test_push.Push(1);  
124.     //  stack_test_push.Push(2);  
125.     //  stack_test_push.Push(3);  
126.     //  stack_test_push.Push(4);  
127.   
128.     // // 测试拷贝构造 和 重载赋值运算符  
129.     //  Stack<int> stack_test_copy;  
130.     //  stack_test_copy = stack_test_push;  
131.     //  Stack<int> stack_test_copying;  
132.     //  stack_test_copying = stack_test_push;  
133.     //   
134.     //  int temp; // 接收 pop出来的值  
135.     //  stack_test_copy.Pop(temp);  
136.     //  stack_test_copy.Pop(temp);  
137.     //  stack_test_copy.Pop(temp);  
138.     //  stack_test_copy.Pop(temp);  
139.     //  stack_test_copy.Pop(temp);  
140.   
141.     // 测试 空栈是否断言成功  
142.     //  Stack<int> s1;  
143.     //  int get_top;  
144.     //  get_top = s1.Top();  
145.   
146.     Stack<int> s2;  
147.     cout << "s2的大小:" << s2.Length() << endl;  
148. }  
149.   
150. int main()  
151. {  
152.     Test();  
153.     return 0;  
154. }

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程