栈的C++实现
数据结构c++实现系列第一篇。
话不多说,直接上代码。
sichstack.h (头文件)
1 #pragma once
2 #include<string>
3
4 namespace sichdc {
5
6 class SStack {
7
8 private:
9
10 // 与栈本身的实现无关
11 // 仅用来标识对象
12 std::string name;
13
14 static const int cap = 3; // 栈的容量
15 int stack[cap]; // 存储数据的数组
16 int top; // 栈顶指针
17
18 public:
19 SStack(std::string n);
20
21 bool IsEmpty(); // 检查栈是否为空
22 bool IsFull(); // 检查栈是否为满
23
24 bool Push(int i); // 压栈
25 bool Pop(); // 弹出栈顶元素
26
27 // 非必要方法
28 int GetTop(); // 返回栈顶元素
29 void ShowSize(); // 显示栈当前大小
30 };
31
32 class SStackTest {
33
34 public:
35 void Test();
36 };
37 }
sichstack.cpp (头文件的实现)
1 #include"sichstack.h"
2 #include<iostream>
3
4 namespace sichdc {
5
6 SStack::SStack(std::string n) {
7
8 name = n;
9
10 for (int i = 0; i < cap; ++i) {
11
12 stack[i] = 0;
13 }
14 top = 0;
15 }
16 bool SStack::IsEmpty() { return top == 0; }
17 bool SStack::IsFull() { return top == cap; }
18 bool SStack::Push(int i) {
19
20 if (IsFull()) { return false; }
21
22 stack[top] = i;
23 top++;
24 return true;
25 }
26 bool SStack::Pop() {
27
28 if (IsEmpty()) { return false; }
29
30 top--;
31 return true;
32 }
33 int SStack::GetTop(){
34
35 // 如果栈为空则返回特殊值-1
36 if (IsEmpty()) { return -1; }
37
38 return stack[top - 1];
39 }
40 void SStack::ShowSize() {
41
42 std::cout << "栈 " << name << " 当前的大小为: " << top << std::endl;
43 }
44
45 void SStackTest::Test() {
46
47 using namespace std;
48
49 SStack ss{"ss"};
50
51 string cmd{}; // 用于接受用户命令
52 int n{}; // 用于接收用户数据
53
54 cout << "_> ";
55 cin >> cmd;
56 while (cmd != "退出") {
57
58 if (cmd == "空栈") {
59
60 cout << (ss.IsEmpty() ? "空栈" : "非空栈") << "\n" << endl;
61 }
62 else if (cmd == "满栈") {
63
64 cout << (ss.IsFull() ? "满栈" : "非满栈") << "\n" << endl;
65 }
66 else if (cmd == "栈大小") {
67
68 ss.ShowSize();
69 cout << endl;
70 }
71 else if (cmd == "压栈") {
72
73 cout << "输入数据:";
74 cin >> n;
75 cout << ss.Push(n) << "\n" << endl;
76 }
77 else if (cmd == "弹出") {
78
79 cout << ss.Pop() << "\n" << endl;
80 }
81 else if (cmd == "读取") {
82
83 cout << ss.GetTop() << "\n" << endl;
84 }
85 else if (cmd == "检查") {
86
87 SStack ss1{ "ss1" };
88
89 while (!ss.IsEmpty()) {
90
91 int t = ss.GetTop();
92 ss1.Push(t);
93 ss.Pop();
94 }
95
96 while (!ss1.IsEmpty()) {
97
98 int t = ss1.GetTop();
99 cout << t << ", ";
100 ss.Push(t);
101 ss1.Pop();
102 }
103
104 cout << "\n" << endl;
105 }
106 else {
107
108 cout << "不支持当前命令!" << "\n" << endl;
109 }
110
111 cout << "_> ";
112 cin >> cmd;
113 }
114 }
115 }
源.cpp (main函数,测试用)
1 #include"sichstack.h"
2 #include<iostream>
3
4 int main() {
5
6 using namespace std;
7 using sichdc::SStackTest;
8
9 cout << "## 程序开始 ##\n";
10
11 SStackTest sst{};
12 sst.Test();
13
14 cout << "## 程序结束 ##\n";
15 return 0;
16 }
总结:
代码是分别写在不同的文件里写的,我个人比较喜欢这种有条理的代码组织方式。
简单介绍一下代码结构:
头文件sichstack.h里在一个命名空间写了两个类,一个栈的实现类,一个栈的测试类。
实现文件sichstack.cpp实现了这两个类。
源.cpp里进行测试。
整个数据结构的实现没有用到STL里封装好的高级数据结构,都是最底层的实现。
栈的C++实现的更多相关文章
- 通往全栈工程师的捷径 —— react
腾讯Bugly特约作者: 左明 首先,我们来看看 React 在世界范围的热度趋势,下图是关键词“房价”和 “React” 在 Google Trends 上的搜索量对比,蓝色的是 React,红色的 ...
- Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)
--reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...
- duang~免费的学习视频来啦:学霸君之全栈测试
学霸君向童鞋们推荐一款 同名学霸学习 视频教程 重点是完全免费收看学习噢!!! 今天 学霸君推荐腾讯课堂的学霸君之全栈测试 复制下方链接至腾讯课堂中报名学习 https://ke.qq.com/cou ...
- [数据结构]——链表(list)、队列(queue)和栈(stack)
在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
- BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 8748 Solved: 3835[Submi ...
- BZOJ 4453: cys就是要拿英魂![后缀数组 ST表 单调栈类似物]
4453: cys就是要拿英魂! Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 90 Solved: 46[Submit][Status][Discu ...
- BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2326 Solved: 1054[Submit][Status ...
- .NET全栈开发工程师学习路径
PS:最近一直反复地看博客园以前发布的一条.NET全栈开发工程师的招聘启事,觉得这是我看过最有创意也最朴实的一个招聘启事,更为重要的是它更像是一个技术提纲,能够指引我们的学习和提升,现在转载过来与各位 ...
- Nodejs之MEAN栈开发(八)---- 用户认证与会话管理详解
用户认证与会话管理基本上是每个网站必备的一个功能.在Asp.net下做的比较多,大体的思路都是先根据用户提供的用户名和密码到数据库找到用户信息,然后校验,校验成功之后记住用户的姓名和相关信息,这个信息 ...
- 匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置
0x00 前言: 匹夫在日常和别人交流的时候,常常会发现一旦讨论涉及到“类型”,话题的热度就会立马升温,因为很多似是而非.或者片面的概念常常被人们当做是全面和正确的答案.加之最近在园子看到有人翻译的& ...
随机推荐
- Android如何使用注解进行代码检查
原文首发于微信公众号:躬行之(jzman-blog),欢迎关注交流! Android Studio 内置了代码检查工具 Lint,可在菜单栏选择 Analyze > Inspect Code 执 ...
- 智慧矿山-选矿工艺数字 3D 可视化
前言 现代科技和工业的发展对矿物原料的要求越来越高,直接开采的原矿石往往达不到标准,而原矿通过选矿加工后则可以满足要求.选矿技术在冶金.煤炭.化工.建材和环保等部门都得到应用,对国民经济的发展意义重大 ...
- Servlet3.x部署描述符
简介 web.xml即部署描述符,位于WEB-INF目录下.在Servlet3以上版本有提供了注解的方式部署Servlet,因此web.xml是可选的.web.xml大概框架如下: <?xml ...
- ==38254==Sanitizer CHECK failed报错解决
跑代码时发现有如下报错: LeakSanitizer: bad pointer 0x7ffd00735130==38254==Sanitizer CHECK failed: ../../../../l ...
- k8s的namespace一直Terminating的完美解决方案
k8s的namespace一直Terminating的完美解决方案 在k8s集群中进行测试删除namespace是经常的事件,而为了方便操作,一般都是直接对整个名称空间进行删除操作. 相信道友们在进行 ...
- 关于freemodbus协议中eMBFuncReadHoldingRegister()函数的所谓错误
摘要:网上看到有好心的网友提示,freemodbus协议中的mbfuncholding.c 文件中eMBFuncReadHoldingRegister()函数,有一处错误,即:第185行的" ...
- CSS精灵图与字体图标
CSS精灵图与字体图标 1. 精灵图 当用户访问一个网站时,需要向服务器发送请求,网页上的每张图像都要经过一次请求才能展现给用户.然而,一个网页中往往会应用很多小的背景图像作为修饰,当网页中的图像过多 ...
- JSX 详解
一 jsx 的本质是什么? jsx是语法糖,需要被编译成js才能运行. jsx 看似是html 结构,实质是js结构的语法糖,在代码编译阶段被编译成js结构.所以jsx的本质可描述为看似html结构的 ...
- SpringBoot常见注解
0.前言 这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的场景.对于每一个注解我都说了具体用法,掌握搞懂,使用 SpringBoot 来开发项目基本没 ...
- day36 Pyhton 网络编程03
一.内容回顾 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...