C语言 栈的表示和实现详细介绍

定义:栈是限定仅在表尾进行插入和删除操作的线性表。

栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。

以上定义是在经典计算机科学中的解释。

在计算机系统中,栈则是一个具有以上属性的动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。在i386机器中,栈顶由称为esp的寄存器进行定位。压栈的操作使得栈顶的地址减小,弹出的操作使得栈顶的地址增大。

栈在程序的运行中有着举足轻重的作用。最重要的是栈保存了一个函数调用时所需要的维护信息,这常常称之为堆栈帧或者活动记录。堆栈帧一般包含如下几方面的信息:

1.函数的返回地址和参数

2.临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量

实现

#define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */

#define STACKINCREMENT 2 /* 存储空间分配增量 */

typedef struct SqStack

{

SElemType *base; /* 在栈构造之前和销毁之后,base的值为NULL */

SElemType *top; /* 栈顶指针 */

int stacksize; /* 当前已分配的存储空间,以元素为单位 */

}SqStack; /* 顺序栈 */

Status InitStack(SqStack *S)

{ /* 构造一个空栈S */

(*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));

if(!(*S).base)

exit(OVERFLOW); /* 存储分配失败 */

(*S).top=(*S).base;

(*S).stacksize=STACK_INIT_SIZE;

return OK;

}

Status DestroyStack(SqStack *S)

{ /* 销毁栈S,S不再存在 */

free((*S).base);

(*S).base=NULL;

(*S).top=NULL;

(*S).stacksize=0;

return OK;

}

Status ClearStack(SqStack *S)

{ /* 把S置为空栈 */

(*S).top=(*S).base;

return OK;

}

Status StackEmpty(SqStack S)

{ /* 若栈S为空栈,则返回TRUE,否则返回FALSE */

if(S.top==S.base)

return TRUE;

else

return FALSE;

}

int StackLength(SqStack S)

{ /* 返回S的元素个数,即栈的长度 */

return S.top-S.base;

}

Status GetTop(SqStack S,SElemType *e)

{ /* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */

if(S.top>S.base)

{

*e=*(S.top-1);

return OK;

}

else

return ERROR;

}

Status Push(SqStack *S,SElemType e)

{ /* 插入元素e为新的栈顶元素 */

if((*S).top-(*S).base>=(*S).stacksize) /* 栈满,追加存储空间 */

{

(*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));

if(!(*S).base)

exit(OVERFLOW); /* 存储分配失败 */

(*S).top=(*S).base+(*S).stacksize;

(*S).stacksize+=STACKINCREMENT;

}

*((*S).top)++=e;

return OK;

}

Status Pop(SqStack *S,SElemType *e)

{ /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */

if((*S).top==(*S).base)

return ERROR;

*e=*--(*S).top;

return OK;

}

Status StackTraverse(SqStack S,Status(*visit)(SElemType))

{ /* 从栈底到栈顶依次对栈中每个元素调用函数visit()。 */

/* 一旦visit()失败,则操作失败 */

while(S.top>S.base)

visit(*S.base++);

printf("\n");

return OK;

}

#include"c1.h"

typedef int SElemType; /* 定义栈元素类型,此句要在c3-1.h的前面 */

#include"c3-1.h"

#include"bo3-1.c"

Status visit(SElemType c)

{

printf("%d ",c);

return OK;

}

void main()

{

int j;

SqStack s;

SElemType e;

if(InitStack(&s)==OK)

for(j=1;j<=12;j++)

Push(&s,j);

printf("栈中元素依次为:");

StackTraverse(s,visit);

Pop(&s,&e);

printf("弹出的栈顶元素 e=%d\n",e);

printf("栈空否:%d(1:空 0:否)\n",StackEmpty(s));

GetTop(s,&e);

printf("栈顶元素 e=%d 栈的长度为%d\n",e,StackLength(s));

ClearStack(&s);

printf("清空栈后,栈空否:%d(1:空 0:否)\n",StackEmpty(s));

DestroyStack(&s);

printf("销毁栈后,s.top=%u s.base=%u s.stacksize=%d\n",s.top,s.base, s.stacksize);

}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

c语言怎样计算栈的长度,C语言 栈的表示和实现详细介绍相关推荐

  1. c语言怎样统计数组的长度,C语言指针难吗?纸老虎而已,纯干货讲解

    原标题:C语言指针难吗?纸老虎而已,纯干货讲解 指针对于C来说太重要.然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识.所以本文尽可能的通过一篇文 ...

  2. c语言sizeof计算int字节数,c语言sizeof获取数据类型长度

    先看代码在看说明和和结果会让人更多的更加纯粹的思考,同时减少多余词汇造成的负担,这里只通过int类型为例试验,其他类型雷同 注意在使用sizeof时与你系统是32位或者64位有关系,同时和你环境中编译 ...

  3. c语言怎么控制输出字符长度,C语言基础之格式化输出控制长度

    c语言格式化输出控制长度 今天在实现ls命令的时候,输出的文件名是上下对齐: 1 2 a.c b crawler text 公共的 视频 文档 音乐 1.c 2.c a.out b.c git win ...

  4. c语言潮流计算验证30节点,C语言潮流计算研究报告.doc

    潮流计算研究报告 潮流计算概述 电力工业是国民经济的基础产业,为保证电力系统安全.稳定及可靠的运行,首先需计算电力系统网络潮流.潮流计算指根据给定的电力系统运行条件及系统接线情况确定整个电力系统各部分 ...

  5. crc16的c语言函数 计算ccitt_求一个C语言实现的CRC16/CCITT-FALSE校验码函数

    匿名用户 1级 2017-02-20 回答 //函数功能:计算CRC16 //参数1:*pData 16位CRC校验数据, //参数2:nLength 数据流长度 //参数3:init 初始化值 // ...

  6. C语言编程计算差商表,计算方法C语言编程计算方法C语言编程.doc

    计算方法C语言编程第二章2已知方程在区间[1,2]内有一根,试问用二分法求根,使其具有5位有效数字至少应二分多少次?[程序设计]#includemain(){int n=0; float x1=1.0 ...

  7. c语言怎么获取数组的长度,C语言怎么获取数组的长度

    c语言中,定义数组后可以用sizeof命令获得数组的长度[可容纳元素个数],通过传递数组名参数到子函数中,以获得数组长度是不可行的. c语言中,定义数组后可以用sizeof命令获得数组的长度(可容纳元 ...

  8. c语言程序计算p q真值表,C语言程序设计第2章数据类型﹒运算符和表达式.ppt

    C语言程序设计第2章数据类型﹒运算符和表达式 教学目标 掌握C语言标识符的组成 理解C语言的基本数据类型 掌握变量定义的方法 掌握常用的运算符的使用 掌握混合运算的数据转换方法 2.1 C语言的数据类 ...

  9. c语言怎么计算bmp图像大小,C语言如何取出一张256色位的bmp图像的某个像素的颜色...

    C语言怎么取出一张256色位的bmp图像的某个像素的颜色 我想实现的是:将一张256色位图的bmp图像(1.bmp)上下左右移动N个像素(比如向右移5个像素,最左边的5个像素全涂成黑色)生成另一张图像 ...

最新文章

  1. 第一章 GuassDB数据库介绍
  2. spring + hibernate
  3. boost::hana::remove用法的测试程序
  4. Elasticsearch技术解析与实战(四)shardreplica机制
  5. php getbyid,ThinkPHP查询中的魔术方法简述
  6. Oracle数据库备份恢复,巡检须要关注的对象设置以及相关恢复概述
  7. 昨天下午施加开始给我们讲业务流程今天说是会继续
  8. 怎么升级计算机硬盘,研究僧 篇一:记一次老电脑的升级之路
  9. 浅谈 HTTPS 和 SSL/TLS 协议的背景与基础
  10. ArcGIS Pro 3.0最新消息
  11. 【长期维护】程序员锻炼法则
  12. 【转】游戏项目管理经验
  13. html2canvas 下载图片 报网络错误
  14. 【供应链案例】屈臣氏是如何优化供应链系统的
  15. MYSQL 命令中常出现的error - 1046 1064 1264
  16. 树上统计——基于树的搜索
  17. 构造方法的定义、重载、调用、使用 (1)定义商品类Goods,
  18. svg loading效果(上百个)
  19. 【软件测试基本流程】
  20. 北方工业大学计算机学院院长,王景中(北方工业大学院长)_百度百科

热门文章

  1. 【模型检测学习笔记】9:Binary Decision Diagrams
  2. 解决兄弟打印机在加入墨粉后如何清零问题
  3. Latex常用公式总结
  4. oracle保留款数据,系列之五:ORACLE EBS 系统主数据管理(B) - season的日志 - 网易博客...
  5. 我开发了一个温柔的智能客服聊天机器人ChatBot,并回答为什么不是ChatGPT(附思路和代码)
  6. Ubuntu16.04离线安装socat
  7. 求问大神!类似于TUTK的P2P云平台还有哪些啊?
  8. 用java编写一个魔塔地图生成器
  9. 如何提升推荐系统的可解释性?京东智能推荐卖点技术全解析
  10. TDH sql及plsql的调优