AUSTOj5

#include<stdio.h> //若用printf,scanf,getchar,putchar,gets,puts函数需包含该头文件
#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;
}

posted @ 2022-10-08 19:56  平凡的柳先生  阅读(21)  评论(0)    收藏  举报