栈的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里封装好的高级数据结构,都是最底层的实现。

posted @ 2020-10-28 22:03  sichVerlieren  阅读(151)  评论(0)    收藏  举报