顺序栈

     顺序栈的基本操作

        1)类型的定义

        2)判空操作

        3)清空操作

        4)求长度

        5)入栈,出栈,取栈

      

<span style="background-color: rgb(51, 255, 51);">//栈类型的定义</span>
#define StackSpaceIncr 20
tydefef struct{
   SElemType *base;   //SElemType为栈中元素类型,是由使用者自己定义的,用tydefef定义成SElemType这个名字,
   int top;           //指向<span style="color:#FF0000;">下一次入栈</span>的索引,这里是<span style="color:#FF0000;">虚指针</span>
   int stackSize;     //栈当前储存空间
}sqStack;              //将这个结构体定义成sqStack类型,以后就可以直接使用了。

<span style="background-color: rgb(51, 255, 51);">//初始化操作</span>
Status InitSqStack(sqStack &S,int InitSize){        //Status是表示返回值的类型,也是由用户自己定义
     S.base = (SElemType*)malloc(InitSize*sizeof(SElemType));
     if( != S.base)  return OVERFLOW;
     S.stackSize = InitSize;
     s.top = 0;        //top(虚指针)是指向入栈的位置,入栈的时候,那位置上有元素的话就覆盖,没元素的话就赋值
     return OK;        //top如果是实指针的话就
}

<span style="background-color: rgb(51, 255, 51);">//判空操作</span>
Status StackIsEmpty(sqStack &S){        <span style="color:#33FFFF;"> //如果是实指针:if(!=S.top+1);</span>
    if(!S.top)  return TRUE;
    else        return FLASE;
                 
}

<span style="background-color: rgb(51, 255, 51);">//清空操作</span>
Status clearStack(sqStack  &S){          <span style="color:#33FFFF;"> //如果是实指针:if(!=S.top+1);</span>
   S.top = 0;
}

<span style="background-color: rgb(51, 255, 51);">//求顺序栈的长度</span>
Status lengthStack(sqStack  &S){
   return S.top;
}

<span style="background-color: rgb(51, 255, 51);">//入栈操作</span>
//判断栈是否已满
//在top位置插入元素
//top向上移动一个位置
Status push(sqStack &S, SElemType e){
 SElemType *newbase; 
  if(S.top == S.stackSize){             //判断当前栈的空间是否已满
      newbase = (SElemType*)realloc(S.base,(S.stackSize + StackSpaceIncr) * sizeof(SElemType));  
      if(!= newbase)        //realloc函数:开辟一个指定大小的新的内存,将原来的S.base复制到那里去,再返回一个指针。                  
         return OVERFLOW;
      S.base = newbase;
      S.stackSize = S.stackSize + StackSpaceIncr;
    }
  S.base[S.top] = e;   //入栈
  S.top++;             //栈顶指针向上移动一位
  return OK;           <span style="color:#33FFFF;">//如果top是实指针的话,上面两句语句的顺序就要调转来用</span>
}

<span style="background-color: rgb(51, 255, 51);">//出栈操作</span>
//判断栈是否为空
//将top向下移动一位
//返回出栈元素
Status Pop(){
 if( !S.top) return ERROR;
 S.top--;
 e = S.base[top];  <span style="color:#33CCFF;"><span style="background-color: rgb(255, 255, 255);">  //如果top是实指针的话,上面两句语句的顺序就要调转来用</span></span>
 return OK;      //这里是写OK,但是一旦用户确定数据的类型后,就得返回具体的值
}
<span style="background-color: rgb(51, 255, 51);">//取栈顶操作</span>
//判空
//直接返回栈顶值
Status getTop(sqStack &S,SElemType e)
{
    if(!= S.top) return ERROE;
    e = S.base[S.top-1]; <span style="color:#33FFFF;"> //如果top是实指针的话:e  = S.base[S.top]</span>
    return OK;
}

链式栈

  元素个数不确定的时候一般使用链式栈

<span style="background-color: rgb(51, 255, 51);">//链式栈的类型定义</span>
typedef struct stackNode{
    SElemType data;
    struct stackNode next*;
}*LinkStack;

<span style="background-color: rgb(51, 255, 51);">//初始化操作</span>
//将头指针S赋为空
void InitLinkStack(LinkStack &S){
      S = unll;
}

<span style="background-color: rgb(51, 255, 51);">//入栈操作</span>
//将元素e入栈即在单链表S的首端插入值为e的结点
status Push(LinkStack &S,SElemType e){
     Lintstack p;
     p = (Lintstack*)malloc(sizeof(struct stackNode));   //创建一个结点
     if(!p) return OVERFLOW;
     p->data = e;                                        //赋值
     p->next = S;                                       
     S = p;
     return OK;
}

<span style="background-color: rgb(51, 204, 0);">//出栈操作</span>
status Pop(LinkStack &S,SElemType e){
  if(!S) return ERROR;
  p = S;                  //p指向栈顶
  S = S->next;            //修改栈顶指针S,指向新栈顶元素
  e = p->data;
  free(p);
  return OK;
}

<span style="background-color: rgb(51, 255, 51);">//取栈顶操作</span>
Status getTop(LinkStack S,SElemType &e){
   if(!S) return ERROR;
   e =S->data;
   return OK;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值