数据结构与算法学习笔记 (5)--顺序栈的实现

举报
王建峰 发表于 2021/11/19 03:59:42 2021/11/19
【摘要】 一、背景 栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈)。允许进行操作的一端称为“栈顶”,另一固定端称为“栈底”,当栈中没有元素时称为“空栈” 特点 :后进先出(LIFO)。      顺序栈 : 它是顺序表的一种,具有顺序表同样的存储结构,由数组定义,配合用数组下标表示的栈顶指针t...

一、背景

栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈)。允许进行操作的一端称为“栈顶”,另一固定端称为“栈底”,当栈中没有元素时称为“空栈”

特点 :后进先出(LIFO)。 

 

 

顺序栈 :
它是顺序表的一种,具有顺序表同样的存储结构,由数组定义,配合用数组下标表示的栈顶指针top(相对指针)完成各种操作。

 

 

二、顺序栈的数据结构


  
  1. typedef int data_t ; /*定义栈中数据元素的数据类型*/
  2. typedef struct
  3. {
  4. data_t *data ; /*用指针指向栈的存储空间*/
  5. int maxlen; /*当前栈的最大元素个数*/
  6. int top ; /*指示栈顶位置(数组下标)的变量*/
  7. } seqstack_t; /*顺序栈类型定义*/

 

三、顺序栈的相关操作

1.创建一个栈


  
  1. sqstack* stack_create(int len)
  2. {
  3. sqstack *s;
  4. if((s=(sqstack *)malloc(sizeof(sqstack)))==NULL)
  5. {
  6. puts("malloc failed");
  7. return NULL;
  8. }
  9. if((s->data=(datatype *)malloc(len*sizeof(datatype)))==NULL)
  10. {
  11. puts("malloc failed");
  12. return NULL;
  13. }
  14. s->maxlen=len;
  15. s->top=-1;
  16. return s;
  17. }

 

2.将一个元素压入(push)栈


  
  1. int stack_push(sqstack* s,datatype value)
  2. {
  3. if(s->top==s->maxlen-1){
  4. puts("stack is full");
  5. return -1;
  6. }
  7. s->data[s->top+1]=value;
  8. s->top++;
  9. return 1;
  10. }

 

3.将一个元素从栈中弹出


  
  1. datatype stack_pop(sqstack* s)
  2. {
  3. s->top--;
  4. return s->data[s->top+1];
  5. }

 

4.释放栈


  
  1. void stack_free(sqstack *s)
  2. {
  3. free(s->data);
  4. s->data=NULL;
  5. free(s);
  6. s=NULL;
  7. }

 

5.其他操作(判断栈空、判断栈满、清空栈)


  
  1. //判断栈是否为空
  2. int stack_empty(sqstack* s)
  3. {
  4. return (s->top==-1 ? 1:0);
  5. }
  6. //判断栈是否为满
  7. int stack_full(sqstack* s)
  8. {
  9. return (s->top==(s->maxlen-1) ? 1:0);
  10. }
  11. //清空栈中的元素
  12. void stack_clear(sqstack* s)
  13. {
  14. s->top = -1;
  15. }

 

文章来源: blog.csdn.net,作者:hinzer,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/feit2417/article/details/81087792

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。