一.栈的基本介绍
栈:特殊的线性表,仅仅可以在固定一端进行插入和删除元素
进行数据插入和删除操作的一端称为栈顶,另一端为栈底
压栈:入数据在栈顶
出栈:出数据在栈顶
二.栈的实现
using namespace std; #include<iostream> //用C++实现栈的相关功能 typedef int STDateType; class Stack { public: //栈的初始化 Stack() { _a = NULL; _top = 0; _capacity = 0; } //入栈 void Push(STDateType x) { if (_top == _capacity) { int newcapacity = _capacity == 0 ? 4 : _capacity * 2; STDateType* tmp = (STDateType*)realloc(_a,sizeof(STDateType)*newcapacity); if (tmp == NULL) { perror("realloc failed"); return; } _a = tmp; _capacity = newcapacity; } _a[_top] = x; _top++; } //打印栈的内容 void Print() { while (_top--) { printf("%d<-", _a[_top]); } } //出栈 void Pop() { if (IsEmpty()) _top--; return; } //获取栈顶元素 int Top() { int tmp = _top; if (IsEmpty()) return _a[--tmp]; return 0; } //判断栈是否为空,为空返回0 int IsEmpty() { if (_top == 0) return 0; else return 1; } //获取栈的元素个数 int Size() { return _top; } //栈的析构 ~Stack() { free(_a); _a = NULL; _top = 0; //标记栈顶的位置 _capacity = 0; } private: STDateType* _a; int _top; int _capacity; }; void Test1() { Stack s1; s1.Push(1); s1.Push(2); s1.Push(3); s1.Push(4); s1.Push(5); s1.Print(); } void Test2() { Stack s1; s1.Push(1); s1.Push(2); s1.Push(3); s1.Push(4); s1.Push(5); s1.Pop(); s1.Pop(); s1.Pop(); s1.Pop(); s1.Pop(); s1.Pop(); s1.Pop(); s1.Pop(); s1.Pop(); s1.Print(); } void Test3() { Stack s1; s1.Push(1); s1.Push(2); s1.Push(3); s1.Push(4); s1.Push(5); printf("%d\n", s1.Top()); s1.Print(); } void Test4() { Stack s1; s1.Push(1); s1.Push(2); s1.Push(3); s1.Push(4); s1.Push(5); printf("%d\n", s1.Size()); s1.Print(); } int main() { //Test1(); //Test2(); //Test3(); //Test4(); return 0; }
三.总结
这回的栈是用C++实现的,C++相对于C语言的实现,有更多好处。
直观上看,代码量是明显减少的,不需要传递指针,只需要在类中之间调用其中的方法,this指针指向创建的对象,被默认传递。构造函数与析构函数减少了遗忘初始化与销毁的函数。变量的调用也更是方便好用。
之后也会更新C++相关文章以及剩下的数据结构。