AUSTOj5
#include<malloc.h> //用malloc,free,realloc函数需包含该头文件
#define MAXSIZE 100 //初始分配存储空间
#define STACKINCREMENT 10 //存储空间分配增量 首先向系统内存申请一块空间(比如可放100个元素),当空间已满,此时要插入一个新元素时,一般得再申请内存空间,比原有空间增加的部分称“分配增量”。 注意并不是申请放多放一个元素大小的空间(即101),因为会出现过于频繁申请的问题,浪费CPU处理时间。 所以可选择一个较大的合适增量,如100+10=110,“10”就是空间分配增量(相当于每插入10个元素才会对内存重新申请)
typedef int ElemType; //声明int和ElemType是等价的
typedef struct STACK //
{
StackType *base; //栈底指针
StackType *top; //栈顶指针
int stacksize; //当前已分配的存储空间
}SqStack; //定义为一个顺序栈
//函数声明
int InitStack(SqStack &s);
void ClearStack(SqStack &S);
int StackEmpty(SqStack S);
int StackLength(SqStack S);
int GetTop(SqStack s,ElemType &e);
int Push(SqStack &s,ElemType e);
int Pop(SqStack &s,ElemType &e);
//初始化,创建空栈
int InitStack(SqStack &s)
{
s->base=( StackType* )malloc( STACK_INIT_SIZE * sizeof( StackType ) ); //分配一个连续的空间
if( s->base == null ) //如果栈底指针为空,则分配内存失败
return error;
s->top = s->base; //栈底和栈顶相同表示一个空栈
s->stacksize = STACK_INIT_SIZE; //内存分配成功
return 1;
}
//清空栈
void ClearStack(SqStack &S)
{
//清空栈底并置空
free( s-> base ) ;
s->base = null ;
s->top = null ;
s->stacksize = 0 ;
return ok ;
}
//判栈空
int StackEmpty(SqStack S)
{
if(s->top = s->base)
return ok;
else
return error;
}
//求栈中元素个数
int StackLength(SqStack S)
{
return s.top - s.base;
}
//获取栈顶元素值
int GetTop(SqStack s,ElemType &e)
{
e=*(s.top-1); //*为取值,栈顶元素=栈顶指针-1
return 1;
}
//入栈
int Push(SqStack &s,ElemType e)
{
if( s->top - s->base >= s->stacksize ) //栈满,追加存储空间,由于栈的空间是连续的,所以地址相减得到的是元素个数
{
s->base = (StackType*)realloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(StackType)); //再分配空间
if ( s->base = null ) return error; //分配内存失败
p->top = p -> base + p->stacksize ;
p->stacksize += STACKSIZE //扩容后的内存
}
*(p->top) = e ; //将p指针指向e,然后p指针上移动
p-> ++;
return 1;
}
//出栈
int Pop(SqStack &s,ElemType &e)
{
if (p->top == p->base)
return ERROR;
--(p->top); //将指针下移
*e = *(p->top);
return OK;
return 1;
}
//打印栈中元素
void PrintElem(SqStack S){
if (S->base == S->top)
{
printf("栈为空\n");
return 0;
}
else
printf("栈中的元素为:\n");
for (; S->top != S->base; S->base++)
{
printf("%d\n", *S->base);
}
return 1;
}
//主函数
int main(){
ElemType e;
SqStack S;//定义一个顺序栈
int n,m;
InitStack(S);//初始化顺序栈
scanf("%d",&n);//请输入要入栈的元素个数
for(int i=0;i<n;i++)
{
scanf("%d",&e);
Push(S,e);//入栈
}
PrintElem(S);//输出栈中元素
printf("\n");
scanf("%d",&m);//请输入要出栈的元素个数
for(int i=0;i<m;i++)
{
Pop(S,e);//出栈
}
GetTop(S,e);//输出栈顶元素
printf("%d %d",e,StackLength(S));
return 0;
}

浙公网安备 33010602011771号