栈
顺序栈的表示和实现
利用顺序结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。另设指针base表示栈底元素在顺序栈中的位置。当top和base的值相等时,表示空栈。
#include<iostream> using namespace std; //顺序栈的存储结构 #define MAXSIZE 100 //顺序栈存储空间的初始分配量 typedef int SElemType; typedef struct{ SElemType *base; //栈底指针 SElemType *top; //栈顶指针 int stacksize; //栈可用的最大容量 }SqStack; //初始化 void InitStack(SqStack &S){ //构造一个空栈 S.base=new SElemType[MAXSIZE]; //为顺序栈动态分配一个最大容量为MAXSIZE的数组空间 if(!S.base) perror("分配失败"); S.top=S.base; //top初始化为base 空栈 S.stacksize=MAXSIZE; //栈最大容量MAXSIZE } //入栈 void Push(SqStack &S,SElemType e){ //插入元素e为新的栈顶元素 if(S.top-S.base==S.stacksize) perror("栈满"); *S.top++=e; } //出栈 void Pop(SqStack &S,SElemType &e){ //删除S的栈顶元素,用e返回其值 if(S.top==S.base) perror("栈空"); e=*--S.top; //栈顶指针-1,将栈顶元素赋给e } //取栈顶元素 SElemType GetTop(SqStack S){ //返回S的栈顶元素 不修改栈顶指针 if(S.top!=S.base) //栈非空 return *(S.top-1); //返回栈顶元素的值,栈顶指针不变 else return 0; } //遍历整个栈 void StackTraverse(SqStack S){ SElemType *t=S.top-1; //指向栈顶元素 while(t>=S.base){ cout<<*t<<" "; t--; } } int main(){ SqStack sqStack; InitStack(sqStack); int item; while(scanf("%d",&item)!=EOF){ Push(sqStack,item); } int topN; Pop(sqStack,topN); printf("%d\n",topN); StackTraverse(sqStack); return 0; }
链栈的表示和实现
链表是指采用链表存储结构实现的栈。链栈的结点结构与单链表的结构相同。
#include<iostream> using namespace std; typedef int ElemType; typedef int SElemType; typedef struct StackNode{ ElemType data; struct StackNode *next; }StackNode,*LinkStack; //栈链的初始化 void InitStack(LinkStack &S){ //构造一个空栈S,栈顶指针置空 S=NULL; } //入栈 void Push(LinkStack &S,SElemType e){ //在栈顶插入元素e StackNode *p=new StackNode;//生成新结点 p->data=e; p->next=S; S=p; } //出栈 void Pop(LinkStack &S,SElemType &e){ //删除S的栈顶元素 用e返回其值 if(S==NULL) perror("栈空"); e=S->data; StackNode *p=S; //用p临时保存栈顶元素空间 以备释放 S=S->next; //修改栈顶指针 delete p; //释放原来 } //取栈顶元素 SElemType GetTop(LinkStack S){ if(S!=NULL){ return S->data; //返回栈顶元素的值,栈顶指针不变 }else{ return -1; } } //遍历栈所有元素 void StackTraverse(LinkStack S){ StackNode *p=S; while(p!=NULL){ cout<<p->data<<" "; p=p->next; } } int main(){ StackNode *stackNode; InitStack(stackNode); int item; while(scanf("%d",&item)!=EOF){ Push(stackNode,item); } StackTraverse(stackNode); return 0; }