第三章(1).顺序栈

来源:互联网 发布:mac安装包损坏 编辑:程序博客网 时间:2024/05/22 07:52

#include<stdio.h>
#include<stdlib.h>

#define STACK_SIZE 100
#define STACKADD 10

typedef int SElemType;

typedef struct
{
 SElemType *base;   //在栈构造之前和销毁之后,base的值为NULL
 SElemType *top;    //栈顶指针
 int stacksize;     //当前已分配的储存空间,以元素为单位
}SqStack;

void InitStack(SqStack *S)
{
 S->base = (SElemType *)malloc(STACK_SIZE*sizeof(SElemType));
 if(!S->base)
 {
  exit(0);
 }
 S->top = S->base;          //look careful!  只能是s->base 赋值给s->top.
 S->stacksize = STACK_SIZE;
}

SElemType GetTop(SqStack S,SElemType *e)
{
 if(S.top == S.base)   //若栈不空,则用e返回栈顶元素
 {
  exit(0);
 }
 *e = *(S.top - 1);   //栈顶指针始终在栈顶元素的下一位置
 return *e;
}

void Push(SqStack *S, SElemType e)   //把元素压入栈顶
{
 if( (S->top - S->base) >= S->stacksize )   //栈满,追加存储空间
 {
  S->base = (SElemType *)realloc(S->base, (S->stacksize + STACKADD));
 
  if(!S->base)
  {
   exit(0);
  }

  S->top = S->base + S->stacksize;
  S->stacksize += STACKADD;
 }

 *(S->top++) = e;
}

SElemType Pop(SqStack *S,SElemType *e)   //取出栈顶元素,并返回
{
 if(S->top == S->base)
 {
  exit(0);
 }

    *e = *(--S->top);  //一定要如此,不能e = (--S->top)
 return *e;   
}

/*此处可以省略return语句,因为e为指针,可以返回获得的值。可如下所示
void Pop(SqStack *S, SElemType *e)
{
 //无return语句
}
*/

int StackEmpty(SqStack S)
{
 if(S.base == S.top)
 {
  return 1;
 }
 return 0;
}

int StackLength(SqStack S)
{
 return (S.top - S.base);
}

void ClearStack(SqStack *S)  //注意清空与销毁的区别
{
 if(S->base)
 {
     S->top = S->base;
 }
}

void DestroyStack(SqStack *S)
{
 if(S->base)
 {
  free(S->base);
 }
 S->top = -1;
}

void main(void)
{
 SqStack *S;
 SElemType *e;

 S = NULL;
 e = NULL;
 e = (SElemType *)malloc(sizeof(SElemType));
    S = (SqStack *)malloc(sizeof(SqStack));

 InitStack(S);

 Push(S,2);

// ClearStack(S);

// Pop(S,e);
 printf("%d\n",Pop(S,e));
 
}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 数学差怎么办脑子不好啊数学学不老 手机号丢失微信密码丢失怎么办找回 悦借钱输入五次密码被锁怎么办 生源地助学贷款密码忘了怎么办 生源地助学贷款登录密码忘了怎么办 助学贷款支付宝密码忘了怎么办 微信密码忘记了手机号也换了怎么办 换手机号了微信密码忘记了怎么办 qq密码忘记了手机号也换了怎么办 一年只能修改一次昵称我能怎么办 华为手机的账号和密码丢失怎么办 华为手机的账号和密码丢失了怎么办 手机号被别人注册了微博怎么办 微博账号一天内多次解冻怎么办 露娜注册时邮箱填错了怎么办 苹果4s手机显示已停用怎么办 新买的微博小号太多内容了怎么办 向海关申报价格低于实际价格怎么办 百度云下载内容包含违规信息怎么办 跨境汇款错了不能退款怎么办 公司欠钱没有还被起诉了。怎么办 战网的姓名不是身份证名字怎么办 手机号码被别人注册了微信怎么办 手机号码被别人注册过微信怎么办 手机号码换了微信密码忘了怎么办 手机号码停了微信密码忘了怎么办 微信好友发的视频删了怎么办 随机生成的微信号搜索不到怎么办 支付宝账户登录密码忘记了怎么办 淘宝支付宝登录密码忘记了怎么办 生源地贷款支付宝账号忘了怎么办 手机号丢了微信找不到密码怎么办 支付宝知道名字不知道姓怎么办 东西丢了从监控里找到怎么办 两人合影其中一人去世怎么办 税务登记证注销但是发票丢失怎么办 发票登报挂失后到国税还要怎么办 广州个体执照没办国税地税怎么办 身份信息被冒用注册了公司怎么办 二级建造师注册有效期过了怎么办 公司变更法人新刻法人章怎么办