栈的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 前言: 匹夫在日常和别人交流的时候,常常会发现一旦讨论涉及到“类型”,话题的热度就会立马升温,因为很多似是而非.或者片面的概念常常被人们当做是全面和正确的答案.加之最近在园子看到有人翻译的& ...
随机推荐
- vue学习06 v-show指令
目录 vue学习06 v-show指令 v-show指令是:根据真假切换元素的显示状态 原理是修改元素的display,实现显示隐藏 指令后面的内容,最终都会解析为布尔值(true和false) 练习 ...
- 【小白学PyTorch】13 EfficientNet详解及PyTorch实现
参考目录: 目录 1 EfficientNet 1.1 概述 1.2 把扩展问题用数学来描述 1.3 实验内容 1.4 compound scaling method 1.5 EfficientNet ...
- Java环境变量配置 新手必备
第一步:安装JDK,无脑下一步 建议修改安装路径 这里以jdk1.7为例子(之前帮机房安装软件,五六十台电脑都要用1.7); 2.安装完了之后右击此电脑,打开属性 打开系统高级设置 打开环境变量 这里 ...
- 编程体系结构(04):JavaIO流文件管理
本文源码:GitHub·点这里 || GitEE·点这里 一.IO流分类 1.分类角度 流的方向 输入流:从数据源中读取数据到应用中的流: 输出流:从应用中将数据写入到目的地的流: 流数据类型 字节流 ...
- php 图片转base4的格式
<?php $url = '1.jpg'; $base64_img = base64_encode(file_get_contents($url));//将图片转base64编码 $imgArr ...
- Python练习题 047:Project Euler 020:阶乘结果各数字之和
本题来自 Project Euler 第20题:https://projecteuler.net/problem=20 ''' Project Euler: Problem 20: Factorial ...
- makefile从入门到入门
makefile文件是用来帮助编译和管理C++项目代码的,需要配合make命令使用.makefile里也可以执行shell操作,具备一部分.sh脚本的功能. makefile格式 makefile内容 ...
- 头文件.h的作用
参考链接http://www.cnblogs.com/webcyz/archive/2012/09/16/2688035.html懒得复制过来
- A4988两相四线步进电机驱动模块使用经验
1.A4988模块可以驱动两相四线步进电机,模块引脚及接线图如下: 2.步进电机引线如下: 3.引脚: ENABLE:低电平有效,用于打开和关闭场效应管的输出: RESET:低电平有效,芯片复位: S ...
- 带有Firebase的离子2:在OAuth 2中签名
介绍 这是一个指南,展示如何在Android上使用Firebase认证谷歌用户. 背景 虽然很多人都写过这个指南,但是他们没有解释一个关键的部分--为什么在执行了每一步之后仍然会看到认证错误12501 ...