C/C++ code#include
#include
#include "../Status.h"
#define STACK_INIT_SIZE 5 //堆栈初始大小
#define STACKINCREMENT 5 //堆栈满之后再增加的大小
typedef char *stackelem;
typedef struct
{
stackelem *base,*top;
int stacksize;
}sqstack;
/*------堆栈基本操作-------*/
Status initstack(sqstack *s)
{
s->base=(stackelem *)malloc(STACK_INIT_SIZE*sizeof(stackelem));
if(!s->base) exit(OVERFLOW);
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
return OK;
}
Status stackempty(sqstack *s)
{
if(s->base==s->top) return TRUE;
return FALSE;
}
Status gettop(sqstack *s,stackelem *e)
{
if(stackempty(s))
{
e=NULL;
printf("取栈顶失败:堆栈为空!\n");
return ERROR;
}
e=s->top-sizeof(stackelem);
return OK;
}
int stacklength(sqstack *s)
{
if(stackempty(s))
return 0;
else
return (s->top-s->base)/sizeof(stackelem);
}
Status push(sqstack *s,stackelem e)
{
if(stacklength(s)>=s->stacksize)
{
printf("堆栈已满,增加空间\n");
s->base=(stackelem *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(stackelem));
if(!s->base)
{
printf("增加空间失败,压栈失败,程序退出!\n");
exit(OVERFLOW);
}
s->top=s->base+s->stacksize*sizeof(stackelem);
s->stacksize+=STACKINCREMENT;
}
*(s->top)=e;
s->top+=sizeof(stackelem);
printf("元素 %s 压栈成功!\n",e);
return OK;
}
Status pop(sqstack *s,stackelem e)
{
if(stackempty(s))
{
printf("出栈失败:栈为空!\n");
return ERROR;
}
s->top-=sizeof(stackelem);
e=*(s->top);
/* *(s->top)=NULL ;*/
printf("元素 %s 出栈成功!\n",e);
return OK;
}
Status clearstack(sqstack *s)
{
stackelem e;
while(!stackempty(s)) pop(s,e);
printf("堆栈已经清空\n");
return OK;
}
Status destroystack(sqstack *s)
{
clearstack(s);
free(s->base);
printf("堆栈已经销毁\n");
return OK;
}
Status printstack(sqstack *s)
{
printf("开始打印堆栈...\n\n");
if(stackempty(s))
{
printf("打印错误:没有可以打印的内容!\n");
printf("\n打印堆栈结束.\n");
return ERROR;
}
stackelem *p=s->top;
while((p>s->base))
{
p-=sizeof(stackelem); //我认为malloc之后不管realloc多少次,如果没有失败,得到的空间应该是连续的,所以这样写
printf("\t%s\n",*p);
}
printf("\n打印堆栈结束.\n");
return OK;
}
void main()
{
sqstack s;
stackelem e;
initstack(&s);
/* push(&s,"2");
printstack(&s);
clearstack(&s);
printstack(&s);*/
push(&s,"1");
push(&s,"2");
push(&s,"3");
push(&s,"4");
push(&s,"5");
push(&s,"6");
push(&s,"7");
push(&s,"8");
push(&s,"9");
push(&s,"10");
push(&s,"11this is just for test");
push(&s,"12this is just for test");
push(&s,"13");
push(&s,"14 this for test");
push(&s,"15");
push(&s,"16");
push(&s,"17");
push(&s,"18");
printstack(&s);
pop(&s,e);
pop(&s,e);
pop(&s,e);
pop(&s,e);
pop(&s,e);
printstack(&s);
destroystack(&s);
}