栈,一种遵循先进先出原则的数据结构,可以用顺序表实现,也可以用链表进行实现。
这里我使用数组实现方法,包含了进栈,出栈,访问栈顶等功能,以及一些辅助功能。
栈Stack类定义如下:
template
class Stack {
public:Stack();Stack(int n);Stack(Stack& stack);~Stack();T& top();Stack& push(const T& elem);Stack& pop();void reserve(int num);int size() {return current+1; }int capciaty() {return cap; }int is_empty() {return current == -1; }bool is_full() {return current == (cap-1); }void clear() {this->~Stack();}
private:T* arr;int current;int cap;
};
其中,成员变量的解释:
arr :数组指针,指向栈底
current : 当前栈顶的索引,没有元素的时候为-1, 有一个元素的时候为0, 以此类推
cap :数组容量,注意容量和元素个数是不同的概念
然后,是成员函数的解释:
Stack(); 默认构造函数
Stack(int n); 一般构造函数,容量为n
Stack(Stack
~Stack(); 析构函数
T& top(); 访问栈顶
Stack
Stack
void reserve(int num); 增加容量
int size() {return current+1; } 获取当前元素个数
int capciaty() {return cap; } 获取容量
int is_empty() {return current == -1; } 是否为空栈
bool is_full() {return current == (cap-1); } 是否满栈
void clear() {this->~Stack();} 清除,调用析构函数
完成实现代码:
#include using namespace std;template
class Stack {
public:Stack();Stack(int n);Stack(Stack& stack);~Stack();T& top();Stack& push(const T& elem);Stack& pop();void reserve(int num);int size() {return current+1; }int capciaty() {return cap; }int is_empty() {return current == -1; }bool is_full() {return current == (cap-1); }void clear() {this->~Stack();}
private:T* arr;int current;int cap;
};//默认构造函数
template
Stack::Stack() {cap = 0;current = -1;arr = nullptr;
}//一般构造函数
template
Stack::Stack(int n) {cap = n;current = -1;arr = new T[n]{};
}//拷贝构造函数(前浅贝)
template
Stack::Stack(Stack& stack) {cap = stack.capciaty();current = stack.size();this->arr = stack.arr;
}//析构函数
template
Stack::~Stack() {if ( cap == 0 ) {return;}cap = 0;current = -1;delete [] arr;arr = nullptr;
}//访问栈顶
template
T& Stack::top() {if ( is_empty() ) {cout << "[error]: stack has no element" << endl;}return *(arr+current);
}//在栈顶添加一个元素
template
Stack& Stack::push(const T& elem) {if ( is_full() ) {reserve(2*cap);}current++;arr[current] = elem;return *this;
}//栈顶弹出
template
Stack& Stack::pop() {if ( is_empty() ) {cout << "[error]: don't try to pop a empty stack" << endl;return *this;}current--;return *this;
}//增加容量
template
void Stack::reserve(int num) {if ( num < cap ) {cout << "[warning]: input of reserve() function shuold lager than capciaty" << endl;return;}T *arr_ = new T[num]{};for ( int i = 0; i <= current; i++ )arr_[i] = arr[i];delete [] arr;arr = arr_;arr_ = nullptr;cap = num;
}int main() {Stack stack(3);
// cout << "top=" << stack.top() << ", 容量=" << stack.capciaty() << ", 元素个数=" << stack.size() << endl;stack.push(3);cout << "top=" << stack.top() << ", 容量=" << stack.capciaty() << ", 元素个数=" << stack.size() << endl;stack.push(2);cout << "top=" << stack.top() << ", 容量=" << stack.capciaty() << ", 元素个数=" << stack.size() << endl;stack.push(5);cout << "top=" << stack.top() << ", 容量=" << stack.capciaty() << ", 元素个数=" << stack.size() << endl;stack.push(5);cout << "top=" << stack.top() << ", 容量=" << stack.capciaty() << ", 元素个数=" << stack.size() << endl;stack.pop();cout << "top=" << stack.top() << ", 容量=" << stack.capciaty() << ", 元素个数=" << stack.size() << endl;stack.clear();cout << "top=" << stack.top() << ", 容量=" << stack.capciaty() << ", 元素个数=" << stack.size() << endl;
}