#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int status;
typedef int elemtype;
typedef struct node{
elemtype *base;
elemtype *top;
int size;
}sqstack;
status initstack(sqstack &s){//初始化栈
s.base=(elemtype *)malloc(LIST_INIT_SIZE*sizeof(elemtype));
if(!s.base)
exit(OVERFLOW);
s.top=s.base;
s.size=LIST_INIT_SIZE;
return OK;
}
status get_top(sqstack s,elemtype &e){//获得栈顶元素
if(s.top==s.base)
return ERROR;
e=*(s.top-1);
return OK;
}
status push(sqstack &s,elemtype e){//向栈中输入元素
if(s.top-s.base>=s.size){
s.base=(elemtype *)realloc(s.base,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(elemtype));
if(!s.base)
exit(OVERFLOW);
s.top=s.base+s.size;
s.size+=LISTINCREMENT;
}
*s.top++=e;
return OK;
}
status pop(sqstack &s,elemtype &e){//删除栈顶元素
if(s.top==s.base)
return ERROR;
e=*--s.top;
return OK;
}
status empty(sqstack &s){//判断栈是否为空
if(s.base==s.top)
return TRUE;
else
return FALSE;
}
status clearstack(sqstack &s){//将栈清空
s.top=s.base;
return OK;
/* elemtype e;
while(!empty(s)){
pop(s,e);
}*/
}
void get_lenght(sqstack s,int &len){//获得栈的长度
len=s.top-s.base;
}
void destroy(sqstack &s){//销毁栈
free(s.base);
s.base=s.top=NULL;
s.size=0;
}
int main(){
sqstack s;
initstack(s);
for(int i=2;i<=5;i++){
push(s,i);
}
elemtype e;
int len;
get_lenght(s,len);//获得栈的长度
destroy(s);//销毁栈
printf("%d\n",len);
clearstack(s);//清空栈
while(!empty(s)){
get_top(s,e);
printf("%d\n",e);//从栈顶依次输出栈
pop(s,e);
}
return 0;
}