栈与链栈

栈是什么,生活中会用到它吗?

例如我们现在打开湖南工业大学官网 ➡ 资源 ➡ 数字资源,其实这就是一个入栈的过程,他们是有先后顺序的,你想再返回到官网首页就要先退出数字资源 ➡ 再退出资源,这其实就是出栈过程。

所以栈就是先进去的后出来。

一、 栈的定义

typedef struct{
int data[MAXSIZE];//int 型数组
int top;//用于栈顶指针,就是计数,确定现在谁在最外面,一会儿好让他出去
}SqStack;

栈是顺序存储 

二、 栈空或者满怎么判断 

现有一int p(增加一个数据p就++),和一个数组a[],那么怎么用这个灵活的P判断这个数组是否为空?

肯定不能说p对应a[0]的时候他为空,因为这说明里面还存放着数据a[0],所以我们可以设定在p=-1的时候判定数组为空。(当然你自己写全部代码的时候,你想规定p=0的时候为空,p=数组长度的时候为满也可以,只是通常不这么默认)

那么又怎么判断数组是否满呢?

最简单的就是当p = 数组长度-1时,就代表这个数组满了。

所以通常规定,栈顶指针top = -1 时,判定栈为空;top = MAXSIZE - 1时栈满。

三、进栈、出栈

3.1 进栈

void push(SqStack *s,int a){

  if ( top >= MAXSIZE){
    {
      cout<<"栈满,无法操作"<<endl;
      return ;
    }
  
   s->top++;
   s->data[s->top] = a ;
   return;
}

3.2 出栈

void Pop(SqStack* s){

    if( s-> top < 0)
     {
        cout<<"操作失败,栈为空"<<endl;
        return;
    }
    
    s->top--;
   }

四、栈的链式储存

栈的链式储存结构,简称为链栈

4.1 链栈构造

typedef struct StackNode{//创建结点,和链表一样
 int data;
 struct StackNode* next;
}SN,* pSN;

typedef struct LinkStack{//创建栈
  pSN top;//头指针,记录头结点
  int count;//记录结点数,
//之前在栈中是直接通过在定义数组时MAXSIZE记录最大容量,
//但链表没有限定的最大容量,除非内存已满,
//所以通过count记录结点数
}LS;

4.2 链栈进栈

注意链栈在进栈时,头指针每次都要发生变化.以下为核心代码

pSN s = (pSN)malloc(sizeof(SN));
//创建一个新结点
s -> data = e;
//新结点的值为e
s -> next = S-> top;
//新节点连接的下一结点是原来结点的头结点
S -> top = s;
//原来结点的头结点现在变成了这个新的结点s
//(别迷糊,不论是S,还是s,都是指针,所以赋值操作就是给首地址
S -> count ++ ;
//链栈的结点增加1

4.3 链栈出栈 

pSN p;//创建临时结点,为后面释放这片地址
if(StackEmpty(*S)) return ;

p = S -> top;//p 现在保存着原来头结点的地址
S -> top = S -> top -> next;
//现在的头结点是原来头结点的下一结点
free(p);
//释放原来头结点的空间
S -> count -- ;
//链栈结点减少1

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值