栈和队列(一)

导语

栈是只允许在一段进行插入和删除操作的线性表,其中允许进行插入删除操作的一端称为栈顶,另一端称为栈底。
栈的基本操作包括有:在栈顶进行插入删除操作、栈的初始化、判断栈是否为空、取栈顶元素、遍历栈。

  • 栈的结构定义
typedef struct Stack{
    sElemType data;//栈中的数据
    sElemType  *top;//栈顶指针
    sElemType  *base;//栈底指针
    int stacksize;//栈底大小
}Stack;
  • 栈的初始化
//初始化一个空栈 
Status InitStack(Stack &S)  {
    S.base=(sElemType*)malloc(maxSize*sizeof(sElemType));//分配存储空间 
    if(!S.base) return ERROR;               //存储空间分配失败    
    S.top=S.base; //栈空
    S.stacksize=maxSize; //设置最大栈空间
    return OK; 
}
  • 判断栈是否为空

栈判断是否为空就是通过判断栈底和栈底是否相等

//判断栈是否为空、
Status StackEmpty(Stack S){
    if(S.top==S.base)//栈空 
        return FALSE;
    else 
        return TRUE;
} 
  • 取栈顶元素
//获取栈顶元素
Status getTop(Stack S,sElemType &e){
    if(S.base==S.top) return ERROR;//栈空
    e =*(S.top-1);
    return OK;
} 
  • 在栈顶插入新元素为栈顶

这里传入的是栈的地址,目的是在函数中插入新的栈顶后会退出,传入地址可以真实改变栈顶,而不仅仅只是在这个函数中发生改变。

//插入新元素为栈顶
Status Push(Stack &S,sElemType e){
    if(S.top-S.base>=S.stacksize){
        S.base =(sElemType*)realloc(S.base,STACKINCREMENT*sizeof(sElemType)) ;
        if(!S.base) exit(OVERFLOW);//存储分配失败
        S.top=S.stacksize+S.base;
        S.stacksize+=STACKINCREMENT; 
    } 
    *S.top++=e;
}
  • 删除栈顶元素
//删除栈顶元素
Status Pop(Stack &S,sElemType &e){
    if(S.top==S.base) return ERROR;//栈空
//  e=*(S.top-1);
//  S.top--;
    e=*--S.top;//与上边注释的两行代码等价
    return OK; 
} 
  • 遍历栈
//遍历栈
Status StackTraverse(Stack S ) {
  sElemType *b=S.base;
  sElemType *t=S.top;
  if(b==t) return ERROR;
  while(t>b){//栈不为空 
    visit(*b);
      b++;   
  }
  printf("\n");
  return OK;
}
  • 总结:在上述代码中发现,凡是涉及到要真实改变栈中的数据的传入的都是地址,不涉及栈的数据改变的传入的都只是当做形参变量在使用。在对栈进行操作时格外要注意栈是否为空。
    演示代码可以去github查看或下载
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值