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

浙公网安备 33010602011771号