由于现在只学了C语言所以就写这个C语言版的栈的基本操作

这里说一下 :网上和书上都有这种写法 int InitStack(SqStack &p)

&p是取地址  但是这种用法好像C并不支持 ,C++才支持,所以用

C语言写就需要使用指针

代码如下:

#include

#include

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

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

#define OK 1

#define ERROR 0

typedef int StackType; //栈元素类型

typedef struct {

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

StackType *top; //栈顶指针

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

}SqStack; //顺序栈

//栈的初始化

int InitStack(SqStack *p) {

p->base = (StackType*)malloc(STACK_INIT_SIZE * sizeof(StackType));

if (p->base == NULL) return ERROR; //内存分配失败

p->top = p->base; //栈顶与栈底相同表示一个空栈

p->stacksize = STACK_INIT_SIZE;

return OK;

}

//判断栈是否为空

int EmptyStack(SqStack *p) {

//若为空栈 则返回OK,否则返回ERROR

if (p->top == p->base) return OK;

else return ERROR;

}

//顺序栈的压入

int Push(SqStack *p,StackType e) {

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

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

{

p->base = (StackType*)realloc(p->base, (p->stacksize + STACKINCREMENT) * sizeof(StackType));

if (p->base == NULL) return ERROR;// 储存空间分配失败

p->top = p->base + p->stacksize; //可能有人觉得这句有点多余(我当时也是这么想的 后面有解释)

p->stacksize += STACKINCREMENT;

}

*(p->top) = e;

(p->top)++;

return OK;

}

// 顺序栈的弹出

int Pop(SqStack *p,StackType *e) {

//若栈不空,则删除p的栈顶元素,用e返回其值

if (p->top == p->base) return ERROR;

--(p->top);

*e = *(p->top);

return OK;

}

//顺序栈的销毁

int DestroyStack(SqStack *p) {

//释放栈底空间并置空

free(p->base);

p->base = NULL;

p->top = NULL;

p->stacksize = ;

return OK;

}

//将顺序栈置空 栈还是存在的,栈中的元素也存在,如果有栈中元素的地址任然能调用

int ClearStack(SqStack *p) {

p->top= p->base;

return OK;

}

//返回顺序栈的元素个数

int StackLength(SqStack p) {

//栈顶指针减去栈底指针等于长度,因为栈顶指针指向当前栈顶元素的下一个位置

return p.top - p.base;

}

//返回顺序栈的栈顶元素

int GetTop(SqStack *p, StackType *e) {

//若栈不为空,则用e返回p的栈顶元素

if (p->top > p->base) {

*e = *(p->top - ); return OK;

}

else return ERROR;

}

//从栈顶到栈底对每个元素调用某个函数

int StackTraverse(SqStack p,void (*pfun)(StackType)/*函数指针*/){

//从栈底到栈顶依次对栈中的每个元素调用函数pfun()

while (p.top > p.base)

pfun(*(p.base)++); //先调用后递增

printf("\n");

return OK;

}

//打印栈中元素

void print(StackType stack) {

printf("%d\n", stack);

}

//测试栈的各种操作

int main() {

int n,i;

StackType *e,a;

SqStack *pstack,stack;

pstack = &stack;

e=(StackType*)malloc(sizeof(StackType)); //为指针e分配内存地址

InitStack(pstack); //初始化栈

if (EmptyStack(pstack) == 1) printf("-------栈为空-------\n");

printf("请输入栈的元素个数:");

scanf("%d", &n);

for (i = ; i < n; i++)

{

scanf("%d", &a);

Push(pstack, a);

}

if (EmptyStack(pstack) == 0) printf("-------栈不为空-----\n");

printf("栈的长度为:%d\n", StackLength(stack));

printf("--------------------\n");

printf("请输入一个入栈元素:");

scanf("%d", &a);

Push(pstack, a);

printf("--------------------\n");

printf("栈中的元素个数为:%d\n", StackLength(stack));

printf("--------------------\n");

GetTop(pstack, e);

printf("栈顶元素为:%d\n", *e);

printf("--------------------\n");

printf("打印栈中的元素:\n");

StackTraverse(stack, print);

printf("---弹出栈顶元素---\n");

Pop(pstack, e);

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

printf("--------------------\n");

GetTop(pstack, e);

printf("栈顶元素为:%d\n", *e);

printf("--------------------\n");

printf("打印栈中的元素:\n");

StackTraverse(stack, print);

printf("--------------------\n");

printf("----------清空栈-------\n");

if (ClearStack(pstack) == ) printf("已清空栈\n");

printf("----------销毁栈-------\n");

if (DestroyStack(pstack) == ) printf("已销毁栈\n");

return ;

}

第39行  p->top = p->base + p->stacksize;这句有必要加上吗?  答案是肯定的。

这一个问题的关键在于 realloc 是怎么实现的,有两种情况:

如果有足够空间用于扩大mem_address指向的内存块,则分配额外内存,并返回mem_address。

这里说的是“扩大”,我们知道,realloc是从堆上分配内存的,当扩大一块内存空间时,

realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平。

也就是说,如果原先的内存大小后面还有足够的空闲空间用来分配,加上原来的空间大小= newsize。

那么就ok。得到的是一块连续的内存。

如果原先的内存大小后面没有足够的空闲空间用来分配,那么从堆中另外找一块newsize大小的内存。

并把原来大小内存空间中的内容复制到newsize中。返回新的mem_address指针。(数据被移动了)。老块被放回堆上。

如果是第二种情况的话,s->top 就不是原来的 top 了     --百度百科

写这些代码的时候还是遇到了一些问题 在这里总结一下:

第一 对于指针的使用要慎重 因为它传递进函数会改变原始数据,所以对于不需要改变

指针指向的值的情况就不要使用指针。

第二 对于指针的使用  如下定义 int *e=NULL; *e=3;

看着好像没有问题  编译也没问题 但是运行程序就出错

为什么?  没有为指针e分配内存地址 所以引用肯定错误啊(我这个逗逼错误-_-)

正确的用法应该是 int *e=NULL;e=(int*)malloc(sizeof(int)); *e=3;

我之前都是 int *e,a; e=&a; e=3; 这种用法 所以......

D&lowbar;S 顺序栈的基本操作

//  main.cpp #include  using namespace std; #include "Status.h" typedef in ...

链栈的基本操作&lpar;C语言&rpar;

栈的链式储存结构称为链栈.链栈的节点类型与链式线性表的节点类型 定义相同,不同的是它是仅在表头进行操作的单链表.链栈通常用不带头节 点的单链表来实现,栈顶指针就是链表的头指针 ,如图所示: 代码如下: ...

php模拟顺序栈基本操作

php模拟顺序栈基本操作 一.总结 写函数什么永远记住边界情况:比如 echo "栈已满!
" ;  栈已空这种,那就能多考虑几种情况,代码就很正宗了 1.对象 ...

C&plus;&plus;语言实现顺序栈

C++语言实现顺序栈 在写C语言实现顺序栈的时候,我已经向大家介绍了栈的特点以及介绍了栈的相关操作,并利用C语言实现了相关算法.在这里小编就不在继续给大家介绍了,需要温习的可以去我的博客看看.在这篇博 ...

把十进制整数转换为r&lpar;r&equals;2&rpar;进制输出&lpar;顺序栈实现&rpar;

上周的第二个作业补上~~ 上周的要求: 1.给出顺序栈的存储结构定义. 2.完成顺序栈的基本操作函数. 1)      初始化顺序栈 2)      实现入栈和出栈操作 3)      实现取栈顶元素 ...

数据结构之顺序栈SqStack

顺序栈SqStack 基本操作 Status InitStack()//构造一个空栈S Status DestroyStack()//销毁栈S,S不再存在 Status ClearStack()//把 ...

数据结构——Java实现顺序栈

一.分析 栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表. 顺序栈是指利用顺序存储结构实现 ...

数据结构(C实现)------- 顺序栈

栈是限定仅在表的一端进行插入或删除的纯属表,通常称同意插入.删除的一端为栈顶(Top),对应在的.则称还有一端为栈底(Bottom). 不含元素的栈则称为空栈. 所设栈S={a1,a2,a3,..., ...

C语言实现顺序栈以及栈的特点

什么是栈? 同顺序表和链表一样,栈也是用来存储逻辑关系为 "一对一" 数据的线性存储结构,如下图所示. 从上图我们看到,栈存储结构与之前所学的线性存储结构有所差异,这缘于栈对数据 ...

随机推荐

nyoj 623 A&ast;B Problem II(矩阵)

A*B Problem II 时间限制:1000 ms  |  内存限制:65535 KB 难度:1   描述 ACM的C++同学有好多作业要做,最头痛莫过于线性代数了,因为每次做到矩阵相乘的时候,大 ...

Kakfa揭秘 Day9 KafkaReceiver源码解析

Kakfa揭秘 Day9 KafkaReceiver源码解析 上一节课中,谈了Direct的方式来访问kafka的Broker,今天主要来谈一下,另一种方式,也就是KafkaReceiver. 初始化 ...

HDU 2266 How Many Equations Can You Find&lpar;DFS&rpar;

How Many Equations Can You Find Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d ...

java swing 下拉框与文本框

import java.awt.*; import javax.swing.*; import javax.swing.border.*; import java.awt.event.*; publi ...

ubuntu 上安装ssh

1. 执行 sudo apt-get update 2. 安装 sudo apt-get install openssh-server 3.查看ssh服务状态 sudo service ssh sta ...

Dwr 框架简单实例

Dwr 是一个 Java 开源库,帮助你实现Ajax网站. 它可以让你在浏览器中的Javascript代码调用Web服务器上的Java,就像在Java代码就在浏览器中一样. Dwr 主要包括两部分: ...

cocos2d 2&period;0和UIKit混合编程&comma; Push CCDirector的时候出现黑屏的天坑

症状 使用cocos2d 2.0和UIKit混合编程, 有一块用cocos2d编写的小程序, 将CCDirector push到一个UINavigationController里面. 虽然事先在后台初 ...

sudo实例--企业生产环境用户权限集中管理方案实例

根据角色的不同,给不同的用户分配不同的角色1.创建初级工程师3个,网络工程师1个,中级工程师1个,经理1个      #  批量创建用户 for user in chuji{01..03} net01 ...

Eqs - poj 1840&lpar;hash&rpar;

题意:对于方程:a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 ,有xi∈[-50,50], xi != 0, any i∈{1,2,3,4,5}. 现在给出a1,a2,a3, ...

顺序栈的实验报告c语言,顺序栈的基本操作(C语言)相关推荐

  1. c语言程序设计实验报告金陵科技学院,金陵科技学院c语言程序设计.doc

    金陵科技学院c语言程序设计.doc 学生实验报告册(理工类)课程名称:C语言程序设计专业班级:14自动化学生学号:1417102015学生姓名:钱涛所属院部:智控院指导教师:樊静2014--2015学 ...

  2. 实验报告微型计算机拆卸顺序表,实验一线性表的顺序存储结构实验报告页.doc...

    实验一线性表的顺序存储结构实验报告页.doc 1 攀 枝 花 学 院 实 验 报 告 实验课程 数据结构 实验项目线性表的顺序存储 实验日期 系 班级 姓名 学号 同组人 指导老师 成绩 实验目的1. ...

  3. python顺序结构实验_Python程序设计实验报告二:顺序结构程序设计

    安徽工程大学 Python程序设计 实验报告 班级 物流192 姓名方伟虎学号3190505205 成绩 日期 2020.3.20 指导老师修宇 [实验名称] 实验二 顺序结构程序设计(验证性实验) ...

  4. python顺序结构实验_Python程序设计实验报告二:顺序结构程序设计(验证性实验)...

    安徽工程大学 Python程序设计 实验报告 班级 物流191 姓名姚彩琴学号3190505129 成绩 日期 2020.3.3 指导老师修宇 [实验名称] 实验二 顺序结构程序设计(验证性实验) [ ...

  5. python顺序结构实验设计_Python程序设计实验报告二:顺序结构程序设计

    安徽工程大学 Python程序设计实验报告 班级 物流192 姓名 周立 学号 3190505227成绩 日期 3月4日 指导老师修宇 实验二 顺序结构程序设计(验证性实验) [实验目的] (1)掌握 ...

  6. 实验报告微型计算机拆卸顺序表,顺序表的操作实验报告馒头制作.doc

    顺序表的操作实验报告馒头制作 实验二 顺序表的操作实验报告 班 级10计科2学号20104012010姓名翁朝伟实验名称顺序表的操作实验目的掌握线性表的顺序存储结构的基本概念.基本操作和应用实验环境硬 ...

  7. c语言程序设计实验报告金陵科技学院,金陵科技学院C语言程序设计 - 图文

    <金陵科技学院C语言程序设计 - 图文>由会员分享,可在线阅读,更多相关<金陵科技学院C语言程序设计 - 图文(6页珍藏版)>请在人人文库网上搜索. 1.金陵科技学院C语言程序 ...

  8. 《数据结构》实验报告二:顺序表 链表

    一.实验目的 1.掌握线性表中元素的前驱.后续的概念. 2.掌握顺序表与链表的建立.插入元素.删除表中某元素的算法. 3.对线性表相应算法的时间复杂度进行分析. 4.理解顺序表.链表数据结构的特点(优 ...

  9. C语言实验报告承诺书怎么写,北方民族大学c语言实验习题.pdf

    北方民族大学c语言实验习题.pdf 1. 数据类型数据类型 a.输入一个小数点后有多位数字的小数,实现将其保留三位小数, 并输出:3.141593.142, 10.123456 10.123 b. 输 ...

  10. c语言维吉尼亚密码实验报告,维吉尼亚密码的C语言实现.doc

    2016春 密码学原理 软件学院 密码学原理作业报告 作业1:古典密码体制的实践与分析 姓名查志华院系软件学院学号1133710313任课教师刘绍辉指导教师刘绍辉实验地点哈尔滨工业大学实验时间2016 ...

最新文章

  1. 祁阳一中2021年高考成绩查询,祁阳一中2019高考成绩喜报、一本二本上线人数情况...
  2. php 报错乱码,thinkphp3 phpexcel 导出报错乱码清除ob
  3. Linux下 运行Jmeter (含一个jmeter简单示例)
  4. 在vue单页应用中使用jquery
  5. python gpu编程_Python笔记_第四篇_高阶编程_进程、线程、协程_5.GPU加速
  6. https://enhancer.io
  7. 华科计算机复试考什么,华科计算机复试的机试
  8. 栈式降噪自编码器_栈式降噪自编码器( SdA)与深度信念网络(DBN)相比有什么特点优势,应用的范围是什么?...
  9. linux下的C语言开发(开篇)
  10. fatal error: gnu/stubs-n64_hard_2008.h: No such file or directory
  11. 跃迁 成为高手的技术
  12. 快手无水印解析API
  13. 曲线曲面基本理论(二)
  14. 数学建模——正态分布检验
  15. 亚马逊养号遛号Selenium自动化测试工具介绍,依托于VMLogin指纹浏览器配套实现。
  16. 表格如何把边框线条加粗
  17. java 拼图_拼图延迟的历史-Oracle正式将Java 9的发布日期推迟到2017年
  18. 格力 大松KJFC230A空气净化器开机自动灯闪烁不工作是什么原因?
  19. 教你如何更改U盘图标
  20. 女生节礼物清单分享,38节适合送女生的礼物合集

热门文章

  1. ArcMap 入门教程
  2. sai笔记1-sai安装
  3. 力软 Learun 是如何验证权限的
  4. Anylogic模型搭建01:医院排队挂号模拟试验
  5. Java爬虫高级教程-动力节点
  6. 初入行的C++程序员,如何快速摆脱CRUD阶段?
  7. 计算机中职基础试题及答案,中职类计算机应用基础试题「附答案」
  8. Java调用Bing翻译
  9. Alex 的 Hadoop 菜鸟教程: 第14课 Sqoop1 从Hbase导出mysql
  10. Weblogic下载安装以及部署