数据结构之顺序栈,C语言实现(详细)

栈的定义与说明

栈是线性表的一种,特点是只能在栈的一端进行插入与删除,这一端叫做栈顶。与之相对的,另外一端叫做栈底

最先被插入的元素会被放在最下方(栈底)。而从栈中往外取元素的时候只能先取最上方的元素。因此栈也叫做先进后出表(FILO)或者后进先出表(LOFI)

栈有两种,一种是顺序栈,一种是链式栈。如下图所示:
顺序栈(左)和链式栈(右)
顺序栈用数组实现,链式栈使用链表实现。
对于顺序栈,我们是从数组的尾部进行插入与删除,以数组尾部作为栈顶

对于链式栈,我们是从链表的表头进行插入与删除,以链表表头作为栈顶

下面是顺序栈的C语言实现:

C语言实现顺序栈

结构体的定义:

struct Stack{
 int *data;     //用指针动态分配内存 
 int capacity;  //容量
 int top;       //栈顶元素 
};

栈的初始化,对于top初始化有两种选择
top=0 表示top始终指向最高元素之上的空格 因此栈满时下标是0~capacity-1 。
top=-1 表示top始终指向最高元素 。

void init(struct Stack *ps,int capacity){  //初始化栈 
 ps->capacity = capacity;
 ps->data = (int *)malloc(sizeof(capacity));
 ps->top = 0;     //初始化可以为 0 or -1 .这里初始化的不同会导致后面判断栈空和栈满的不同 
}

判断栈是否已满

int isFull (const struct Stack *ps){ //判断栈是否已满 
 return ps->top == ps->capacity;
}

判断栈是否非空

int isEmpty(const struct Stack *ps){    //判断栈是否为空
    return ps->top == 0; 
} 

压栈操作,x表示压入的元素

int push(struct Stack *ps,int x){    //压栈 
 if(isFull(ps)) return 0;
 else{
  ps->data[ps->top] = x;
  ps->top++;
  return 1; //压栈成功 
 }
}

弹栈操作,并将弹出的元素返回

int pop(struct Stack *ps,int *px){ //弹栈,并将栈顶元素返回给*px 
 if(isEmpty(ps)) return 0;
 else{
  ps->top--;
  *px = ps->data[ps->top];
  return 1; //弹栈成功 
 } 
} 

使用完毕,释放栈的空间

void destory(struct Stack *ps){    //好习惯,使用完栈,将分配的空间释放,以防日后需要多次使用 
 free(ps->data);
} 

完整代码

#include<stdio.h>
#include<stdlib.h>
using namespace std;
//顺序栈 
struct Stack{
 int *data;     //用指针动态分配内存 
 int capacity;  //容量
 int top;       //栈顶元素 
};

void init(struct Stack *ps,int capacity){  //初始化栈 
 ps->capacity = capacity;
 ps->data = (int *)malloc(sizeof(capacity));
 ps->top = 0;     //初始化可以为 0 or -1 .这里初始化的不同会导致后面判断栈空和栈满的不同 
} //top=0 表示top始终指向最高元素之上的空格  因此栈满时下标是0~capacity-1 
    //top=-1 表示top始终指向最高元素 
    
int isFull (const struct Stack *ps){ //判断栈是否已满 
 return ps->top == ps->capacity;
}

 int isEmpty(const struct Stack *ps){    //判断栈是否为空
    return ps->top == 0; 
} 

int push(struct Stack *ps,int x){    //压栈 
 if(isFull(ps)) return 0;
 else{
  ps->data[ps->top] = x;
  ps->top++;
  return 1; //压栈成功 
 }
}

int pop(struct Stack *ps,int *px){ //弹栈,并将栈顶元素返回给*px 
 if(isEmpty(ps)) return 0;
 else{
  ps->top--;
  *px = ps->data[ps->top];
  return 1; //弹栈成功 
 } 
} 

void destory(struct Stack *ps){    //好习惯,使用完栈,将分配的空间释放,以防日后需要多次使用 
 free(ps->data);
} 

int main()
{ 
  struct Stack st;
  init(&st,5); 
  push(&st,11);
  push(&st,22);
  push(&st,33);
  push(&st,44);
  push(&st,55);
  push(&st,66);
  int x;
  pop(&st,&x);
  printf("%d\n",x);
  destory(&st); 
 
 return 0; 
} 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值