数据结构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++实现的更多相关文章

  1. 通往全栈工程师的捷径 —— react

    腾讯Bugly特约作者: 左明 首先,我们来看看 React 在世界范围的热度趋势,下图是关键词“房价”和 “React” 在 Google Trends 上的搜索量对比,蓝色的是 React,红色的 ...

  2. Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)

    --reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...

  3. duang~免费的学习视频来啦:学霸君之全栈测试

    学霸君向童鞋们推荐一款 同名学霸学习 视频教程 重点是完全免费收看学习噢!!! 今天 学霸君推荐腾讯课堂的学霸君之全栈测试 复制下方链接至腾讯课堂中报名学习 https://ke.qq.com/cou ...

  4. [数据结构]——链表(list)、队列(queue)和栈(stack)

    在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...

  5. BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 8748  Solved: 3835[Submi ...

  6. BZOJ 4453: cys就是要拿英魂![后缀数组 ST表 单调栈类似物]

    4453: cys就是要拿英魂! Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 90  Solved: 46[Submit][Status][Discu ...

  7. BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2326  Solved: 1054[Submit][Status ...

  8. .NET全栈开发工程师学习路径

    PS:最近一直反复地看博客园以前发布的一条.NET全栈开发工程师的招聘启事,觉得这是我看过最有创意也最朴实的一个招聘启事,更为重要的是它更像是一个技术提纲,能够指引我们的学习和提升,现在转载过来与各位 ...

  9. Nodejs之MEAN栈开发(八)---- 用户认证与会话管理详解

    用户认证与会话管理基本上是每个网站必备的一个功能.在Asp.net下做的比较多,大体的思路都是先根据用户提供的用户名和密码到数据库找到用户信息,然后校验,校验成功之后记住用户的姓名和相关信息,这个信息 ...

  10. 匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置

    0x00 前言: 匹夫在日常和别人交流的时候,常常会发现一旦讨论涉及到“类型”,话题的热度就会立马升温,因为很多似是而非.或者片面的概念常常被人们当做是全面和正确的答案.加之最近在园子看到有人翻译的& ...

随机推荐

  1. CBC字节翻转攻击

    iscc2018线上赛开始两周多了,学到了很多,写几篇文章总结一下遇到的知识点,做一个归纳,方便以后查找. web300-----CBC字节翻转攻击 cbc是AES加密的cbc模式 即密码分组链模式: ...

  2. python3-day3

    一.函数基本语法及特性 重复用到的代码通过def封装起来,用到的时候直接调用函数名字:语法 1 def 函数名字(内容): 2 需要执行的动作 什么是函数: 函数一词来源于数学,但编程中的「函数」概念 ...

  3. 【性能监控-Perfmon工具】Perfmon工具使用教程

    一.Perfmon工具简介 Perfmon是一款Windows自带的性能监控工具,提供了图表化的系统性能实时监视器.性能日志和警报管理.通过添加性能计数器可以实现对CPU.内存.网络.磁盘.进程等多类 ...

  4. Spring 配置文件配置事务

    一.引入事务的头文件 xmlns:tx="http://www.springframework.org/schema/tx" http://www.springframework. ...

  5. SpringBoot整合SpringDataJPA,今天没啥事情就看了一下springboot整合springdataJPA,实在是香啊,SQL语句都不用写了

    SpringBoot整合SpringDataJPA 1.JPA概念 JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映 ...

  6. 使用Ajax新闻系统管理需求分析

      新闻系统管理需求分析 1.1项目背景 新闻发布系统(News Release System or Content Management System),是一个基于新闻和内容管理的全站管理系统,本系 ...

  7. Example Code for a TMP102 I2c Thermometer————Arduino

    参考:https://playground.arduino.cc/Code/TMP102/ Example Code for a TMP102 I2c Thermometer I've fairly ...

  8. matlab中subplot 在平铺位置创建坐标区

    来源:https://ww2.mathworks.cn/help/matlab/ref/subplot.html?searchHighlight=subplot&s_tid=doc_srcht ...

  9. Word+Excel 问题及解决

    [Word] 快捷操作 (1)每个字后面都有换行符的处理办法: 替换:∧p -> 空格 (2)隐藏Word文档中的换行符: word选项 -> 显示 -> 段落标记 [Excel]

  10. VS2019 配置opencv4.4

    安装VS2019 参考:链接 下载opencv 链接 下载此时的最新版4.4.0 最后"上墙"下,不然很慢! 安装opencv 我的安装位置是:D:\soft\opencv\ins ...