堆栈
【链表实现堆栈】
优点:可以无限增添元素,只要内存足够,
缺点:内存中存储位置不连续
typedef int ElementType; //只能向头部插入元素,因为如果在尾部插入,删除时,找不到上一个节点/ //因为链表是单向的 //所以 push pop 操作在头结点进行 class Stack{ public: Stack(){ S=(Stack*)malloc(sizeof(Stack)); //建立一个不存数据的头结点,方便增删节点 S->Next=NULL; sz=0; } bool empty(){ return (S->Next==NULL); } int size(){ return sz; } void push(ElementType X){ Stack* TmpCell=(Stack*)malloc(sizeof(Stack)); TmpCell->Date=X; TmpCell->Next=S->Next; //在头部增添节点 S->Next=TmpCell; sz++; } ElementType pop(){ Stack* FirstCell; //因为只是用了指向头结点,所以并不需要分配空间 ElementType TopElem; if(empty()){ cout<<"堆栈空"<<endl; return -1; } else{ sz--; FirstCell=S->Next; TopElem=FirstCell->Date; S->Next=FirstCell->Next; free(FirstCell); //释放内存 return TopElem; } } private: int Date; Stack* Next; Stack* S; int sz;//记录栈中元素个数 }stack;
【动态数组实现堆栈】
好处:申请了连续的内存空间,而且可以无限增添元素(内存足够)
初始化用malloc函数为动态数组分配maxn个空间,
s=(ElementType*)malloc(maxn*sizeof(ElementType));
如果数组满了,用realloc函数,重新分配空间,多分配一个maxn;
if(Top+1>=maxn*N){ //如果当前栈中元素总量已满, 则重新申请空间,增加maxn个空间 N++; s=(ElementType*)realloc(s,N*maxn*sizeof(ElementType)); }
整体代码
const int maxn = 10; typedef int ElementType; class Stack{ public: Stack(){ s=(ElementType*)malloc(maxn*sizeof(ElementType)); Top=-1; //因为希望元素从下标0开始储存,将Top置为-1 N=1; } bool empty(){ return (Top==-1); } int size(){ return Top+1; } void push(ElementType X){ if(Top+1>=maxn*N){ //如果当前栈中元素总量已满, 则重新申请空间,增加maxn个空间 N++; s=(ElementType*)realloc(s,N*maxn*sizeof(ElementType)); } s[++Top]=X; } ElementType pop(){ if(empty()){ cout<<"堆栈空"<<endl; return -1; } else { return s[Top--]; } } private: int Top; //记录栈顶位置 int Date; int N; //记录申请了几倍的maxn ElementType* s; }stack;
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-12-25 10:18:12