数据结构之顺序表栈

好像有点小问题

#include <stdio.h> 
#include <malloc.h> 
  
typedef int SElemType; 
typedef int Status; 
#define INIT_SIZE 100 
#define STACKINCREMENT 10 
#define Ok 1 
#define Error 0 
#define True 1 
#define False 0 
typedef struct 

  SElemType *base; 
  SElemType *top; 
  int stacksize; 
}SqStack; 
  
//初始化栈 
Status InitStack(SqStack *s) 

  s->base = (SElemType *)malloc(INIT_SIZE * sizeof(SElemType)); 
  if(!s->base) 
  { 
    puts("存储空间分配失败!"); 
    return Error; 
  } 
  s->top = s->base; 
  s->stacksize = INIT_SIZE; 
  return Ok; 

  
//清空栈 
Status ClearStack(SqStack *s) 
 { 
  s->top = s->base; 
  return Ok; 
 } 
  
//栈是否为空 
Status StackEmpty(SqStack *s) 
 { 
  if(s->top == s->base) 
   return True; 
  else
   return False; 
 } 
  
//销毁栈 
Status Destroy(SqStack *s) 

  free(s->base); 
  s->base = NULL; 
  s->top = NULL; 
  s->stacksize=0; 
  return Ok; 

  
//获得栈顶元素 
Status GetTop(SqStack *s, SElemType &e) 

  if(s->top == s->base) return Error; 
  e = *(s->top - 1); 
  return Ok; 

  
//压栈 
Status Push(SqStack *s, SElemType e) 

  if(s->top - s->base >= s->stacksize)//栈满 
  { 
    s->base = (SElemType *)realloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(SElemType)); 
    if(!s->base) 
    { 
      puts("存储空间分配失败!"); 
      return Error; 
    } 
    s->top = s->base + s->stacksize;//修改栈顶位置 
    s->stacksize += STACKINCREMENT;//修改栈长度 
  
  } 
  *s->top++ = e; 
  return Ok; 

  
//弹栈 
Status Pop(SqStack *s, SElemType *e) 

  if(s->top == s->base) return Error; 
  --s->top; 
  *e = *(s->top); 
  return Ok; 

  
//遍历栈 
Status StackTraverse(SqStack *s,Status(*visit)(SElemType)) 
 { 
   SElemType *b = s->base;//此处不能直接用base或top移动,即不能改变原栈的结构 
   SElemType *t = s->top; 
  while(t > b) 
   visit(*b++); 
  printf("\n"); 
  return Ok; 
 } 
  
Status visit(SElemType c) 
 { 
  printf("%d ",c); 
  return Ok; 
 } 

int main() 

    SqStack a; 
  SqStack *s = &a; 
  SElemType e;
  printf("构造一个空栈……\n");   
  InitStack(s); 
  int n; 
  puts("请输入要进栈的个数:"); 
  scanf("%d", &n);
  printf("请输入进栈元素:"); 
  while(n--) 
  { 
    int m; 
    scanf("%d", &m); 
    Push(s, m); 
  } 
  printf("……本栈是空栈吗??……\n");
  if (StackEmpty(s) )
         printf("YES !!!\n");
  else
         printf("NO !!!\n");
  printf("遍历输出栈中的所有元素:\n");
  StackTraverse(s,visit);
  printf("\n");
  printf("……输出栈顶元素……\n");
  e = GetTop(s, e);
  printf("栈顶元素是:\n");
  printf("%d\n",e);
  printf("……栈顶插入元素……\n");
  printf("请输入要插入的元素的数值:\n");
  scanf("%d",&e);
  Push(s,e);
  printf("现在栈中的元素是:\n");
  StackTraverse(s,visit);
  printf("\n");
  printf("……栈顶删除元素……\n");
  printf("删除的元素是:\n");
  scanf("%d",&e);
  StackTraverse(s, visit); 
  puts(""); 
  Pop(s, &e);
  printf("现在栈中的元素是:\n");
  StackTraverse(s,visit);
  printf("\n");  
  printf("……销毁栈……\n");
    if(Destroy(s))
         printf("销毁栈成功\n");
    else
         printf("销毁栈失败\n");
  printf("……清空栈……\n");
  if((ClearStack(s)))
         printf("清空栈成功\n");
    else
         printf("清空栈失败\n");
  printf("您已经成功完成所有的功能!!!\n");    
/* 
  SqStack a; 
  SqStack *s = &a; 
  SElemType e;   
  InitStack(s); 
  int n; 
  puts("请输入要进栈的个数:"); 
  scanf("%d", &n); 
  while(n--) 
  { 
    int m; 
    scanf("%d", &m); 
    Push(s, m); 
  } 
  StackTraverse(s, visit); 
  puts(""); 
  puts("8进栈后:"); 
  Push(s, 8); 
  StackTraverse(s, visit); 
  puts(""); 
  Pop(s, &e); 
  printf("出栈的元素是:%d\n", e); 
  printf("元素出栈后事实上并没有清除,依然存在于内存空间,所谓的出栈只是指针移动,出栈的元素是%d\n", *s->top);//判断出栈后元素是否还存在于内存中 
  Destroy(s); 
  */ 
  return 0; 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流萤数点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值