棧是一種運算受限的線性表,是一種先進后出的數據結構,限定只能在一端進行插入和刪除操作,允許操作的一端稱為棧頂,不允許操作的稱為棧底
因此需要的成員變量如下
int *_stack; //指向申請的空間的首地址 int top; //記錄棧頂的位置 int size; //記錄申請空間的大小
具體如下封裝在類中
#include<iostream> #include<stdlib.h> #include<string.h> using namespace std; class SeqStack { public: SeqStack(int size=10) //構造函數 初始化 { _stack=new int[size]; _top=0; _size=size; } SeqStack(const SeqStack &src) // 拷貝構造函數(防止淺拷貝) { _stack=new int[src._size]; int i=0; for(;i<src._top;i++) { _stack[i]=src._stack[i]; } _size=src._size; _top=src._top; } SeqStack(SeqStack &&src) //右值拷貝函數 防止臨時量的空間時間的浪費 { _stack=src._stack; _size=src._size; _top=src._top; src._stack=nullptr; } SeqStack & operator=(const SeqStack &src) //賦值構造函數 返回地址 實現連續賦值 { if(this==&src) { return *this; } delete[]_stack; _stack=new int[src._size]; int i=0; for(;i<src._top;i++) { _stack[i]=src._stack[i]; } _size=src._size; _top=src._top; return *this; } SeqStack & operator=( SeqStack &&src) // 右值賦值構造函數 防止臨時量對空間時間的浪費 { delete []_stack; _stack=src._stack; _size=src._size; _top=src._top; src._stack=nullptr; return *this; } ~SeqStack() // 析構函數 { delete[]_stack; _stack=nullptr; } void push(int val) // 棧頂插入 { if(full()) { resize(); // 調用2倍擴容 } _stack[_top]=val; _top++; } void pop() // 棧頂刪除 { if(empty()) { return; } _top--; } int top() //返回棧頂元素 { return mpstack[_top-1]; } bool empty() // 是否為空 { return _top==0; } bool full() // 是否為滿 { return _top==_size; } private: int *_stack; int _top; int _size; void resize() // 2倍擴容函數 { int *s=new int[_size*2]; int i=0; for(;i<_size;i++) { s[i]= _stack[i]; } delete []_stack; _stack=s; _size=2*_size; } }; int main() { SeqStack st1(20); SeqStack st2(st1); SeqStack st3=st1; st2=st1; st1.push(1); cout<<st1.top()<<endl; cout<<endl; return 0; }