栈和队列(笔记)

一,顺序栈的基本算法

(1)初始化

void InitStack(SqStack *S){
 S->top=-1;
}

(2)判栈空

bool StackEmpty(SqStack S){
  if(S->top==-1){
 return TRUE;\\栈为空
}else {
return FALSE;\\不为空
}

(3)入栈Push

Status Push(SqStrack *S,Eemptype e){
  if(S->top==MAXSIZE -1){
   return ERROR;}\\栈为空
  S->top++;
  S->Data[S->top]=e;
return OK;
}

(4)出栈Pop

Status Pop(SqStack *S,Emetype *e){
  if(S->top==MAXSIZE-1){
  return ERROR;}
 *e=S->Data[S->top];
S->top--;
return OK;
}

(5)读栈顶元素

Status GetTop(SqStatus *S,Emetype *e){
 if(S->top==-1){
 return ERROR;}
 *e=S->Data[S->top];
return e;
}

二,共享栈

(1)共享栈概念

两个顺序栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸

两个栈的栈顶指针都指向栈顶元素,top0=-1时0号栈为空,top1=MaxSize时1号栈为空;仅当两个栈顶指针相邻(top0+1=top1)时,判断为栈满。当0号栈进栈时top0先加1再赋值,1号栈进栈时top1先减一再赋值出栈时则刚好相反。

(2)共享栈的空间结构

#define MAXSIZE 50
typedef int ElemType;
typedef struct{
  ElemType data[MAXSIZE];
  int top0;
  int top1;
}SqDoubleStack;

(3)共享栈进栈

判断是栈0还是栈1的栈号参数stackNumber。

Status Push(SqDoubleStack *S,ElemType e,int StackNumber){
  if(S->top0+1=S->top1){
    return ERROR;} \\栈满
  if(StackNumber=0){
    S->data[++S->top0]= e;
}\\0栈加一
  if(StackNumber=1){
    S->data[--S->top1]=e
}\\1栈减一
 return ok
}

(4)共享栈出栈

Status Pop(SqDoubleStack *S,ElemType*e,int StackNumber){
 if(StackNumber=0){
  if(S->top0=-1){
   return ERROR;}\\0栈空
   *e=S->data[S->top0--];
 }
 if(StackNumber=1){
  if(S->top1=MAXSIZE){
   return ERROR;}
    *e=S->data[S->top1++];
 }
return ok;

三,栈的链式存储结构

1.链栈

这里规定链栈没有头节点,Lhead指向栈顶元素

对于空栈来说,链表原定义是头指针指向空,那么链栈的空其实就是top=NULL的时候。

链栈的结构代码

/*构造节点*/
typedef Struct StackNode{
   ElemType data;
   struct StackNode *next;
}StackNode,*LinkStackPrt;
/*构造链栈*/
typedef Stuct LinkStack{
   LinkStackPrt top;
   int count;
}LinkStack;

2.链栈的基本算法

(1)链栈的进栈

Status Push(LinkStack *s,ElemType e)
{
  LinkStackPrt p=(LinkStackPrt)malloc(sizeof(StackNode));
  p->data=e;
  p->next=s->top;
  s-<top=p;
  s->count++;
  return OK;
}

(3)链栈的出栈

Status Pop(LinkStack *s,ElemType *e)
{
  LinkStackPtr p;
  if(StackEmpty(*s)){
     return ERROR;
 }
  *e=s->top->data;
  p=s->top;
  s->top=s->top->next;
  free(p);
  s->count--;
  return OK;
}

四,栈的应用——递归

(1)递归的定义

简单地说,若在一个函数、过程或数据结构的定义中又应用了它自身,则这个函数、过程或数据结构称为是递归定义的,简称递归。

(2)斐波那契数列

int Fib(int n){
 if(n==0){
  return 0;
 }else if(n==1){
  return 1;
 }else{
  return Fib(n-1)+Fib(n-2);

必须注意递归模型不能是循环定义的,其必须满足下面的两个条件

  • 递归表达式(递归体)
  • 边界条件(递归出口)

五、栈的应用——四则运算表达式求值

后缀表达式计算规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进项运算,运算结果进栈,一直到最终获得结果。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值