全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C语言数据结构 栈的基础操作

C语言数据结构 栈的基础操作

实现了栈的基本操作,包括入栈出栈,以及书上没有写的销毁栈等操作,并对代码进行了详细的注释

MyStack.h

/*
 * Include.h
 *
 * Created on: 2016.11.23
 *   Author: Jack Cui
 */

#ifndef MYSTACK_H_
#define MYSTACK_H_

#include <stdlib.h>
#include <stdio.h>
#include <malloc.h> 
/*栈(Stack)是限定仅在表尾进行插入或删除操作的线性表
**栈顶(top)和栈底(bottom)相等,代表为空栈
**
*/

//SElemType是某个确定的、将由用户自行定义的、含某个关系运算的数据对象
typedef int SElemType;

//函数结果状态代码
#define TRUE    1  
#define FALSE    0
#define OK     1
#define ERROR    0
#define INFEASIBLE -1   //不可行
#define MY_OVERFLOW -2   //溢出

/**********栈的顺序存储表示**********/
#define STACK_INIT_SIZE 100   //存储空间初始分配量
#define STACKINCREMENT 10   //存储空间分配增量

typedef struct{
  SElemType *base;  //在栈构造之前和销毁之后,base的值为NULL
  SElemType *top;   //栈顶指针
  int stacksize;   //当前已分配
}SqStack;
/**********基本操作的函数原型说明**********/
//构造一个空栈S
Status InitStack(SqStack &S);      
//销毁栈S,S不再存在
Status DestroyStack(SqStack &S);
//把S置为空栈
Status ClearStack(SqStack &S);
//若栈S为空栈,则返回TURE,否则返回FALSE
Status StackEmpty(SqStack S); 
//返回S的元素个数,即栈的长度
int StackLength(SqStack S);
//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
Status GetTop(SqStack S, SElemType &e); 
//插入元素e为新的栈顶元素
Status Push(SqStack &S, SElemType e);
//若栈不空,则删除S的栈顶元素,用e新栈顶的值,并返回OK;否则返回ERROR;
Status Pop(SqStack &S, SElemType &e);
//从栈底到栈顶依次对栈中每个元素调用函数visit();一旦visit()失败,则操作失败
Status StackTraverse(SqStack S, Status(* visit)(SElemType));
//visit()函数
Status visit(SElemType e);
//测试函数
Status TestMyStack();

#endif MYSTACK_H_

MyStack.c

#include "MyStack.h"

Status InitStack(SqStack &S){
  //构造一个空栈S
  S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
  if(!S.base){    //存储分配失败
    printf("InitStack: malloc err\n");
    exit(MY_OVERFLOW);
  }
  S.top = S.base;
  S.stacksize = STACK_INIT_SIZE;
  return OK;
}//InitStack

Status DestroyStack(SqStack &S){
  if(!S.base){
    printf("DestroyStack: Stack does not exist\n");
    exit(MY_OVERFLOW);
  }
//在调用malloc的时候,系统会记住你申请的这块连续空间的起始地址以及这块空间的大小,
//释放free的时候,只要把这个起始地址告诉系统,系统自然就知道要释放多大的空间。
  free(S.base);    
  S.top = NULL;
  S.base = NULL;
  S.stacksize = 0;
  return OK;
}//DestroyStack

Status ClearStack(SqStack &S){
  if(!S.base){
    printf("ClearStack: Stack does not exist\n");
    exit(MY_OVERFLOW);
  }
  S.top = S.base; 
  return OK; 
}//ClearStack

Status StackEmpty(SqStack S){
  if(S.top == S.base){
    return TRUE;
  }
  else{
    return FALSE;
  }
}//StackEmpty

int StackLength(SqStack S){
  return S.top - S.base;
}//StackLength

Status GetTop(SqStack S, SElemType &e){
  ////若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
  if(S.top == S.base){
    printf("GetTop: Stack is empty\n");
    return ERROR;
  }
  e = *(S.top - 1);
  return OK;
}//GetTop

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){
      printf("Push: realloc error\n");
    }
    S.top = S.base + S.stacksize;
    S.stacksize += STACKINCREMENT;
  }
  *S.top++ = e;    //*S.top = e; S.top++;
  return OK;
}//Push

Status Pop(SqStack &S, SElemType &e){
  //若栈不空,则删除S的栈顶元素,用e返回新栈顶的值,并返回OK,否则返回ERROR;
  if(S.top == S.base){
    printf("Pop: Stack is empty\n");
    return ERROR;
  }
  e = *--S.top;    //S.top--; e = *S.top;
  return OK;
}//Pop

Status StackTraverse(SqStack S, Status(* visit)(SElemType)){
  while(S.top > S.base){
    visit(*S.base++); 
  } 
  printf("\n");
  return OK; 
}//StackTraverse

Status visit(SElemType e){
  printf("%d ",e) ;
  return OK;
}//visit

Status TestMyStack(){
  SElemType 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); 
  return 0; 
}//TestMyStack

//主函数
int main(){
  TestMyStack();
  system("pause");
  return 0;
}

运行结果

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


# C语言数据结构  #   # 数据结构栈  # C语言实现通用数据结构之通用椎栈  # C语言数据结构进阶之栈和队列的实现  # C语言编程数据结构栈与队列的全面讲解示例教程  # C语言编程数据结构的栈和队列  # C语言数据结构之使用链表模拟栈的实例  # C语言数据结构之栈简单操作  # 详解C语言数据结构之栈  # 为空  # 不空  # 这块  # 则用  # 要把  # 数据结构  # 希望能  # 弹出  # 多大  # 或删除  # 并对  # 谢谢大家  # 将由  # 书上  # 值为  # 进行了  # 依次为  # 长度为  # 实现了  # 就知道 


相关文章: 智能起名网站制作软件有哪些,制作logo的软件?  建站之星安装提示数据库无法连接如何解决?  建站之星后台密码遗忘或太弱?如何重置与强化?  如何通过服务器快速搭建网站?完整步骤解析  如何选择高效可靠的多用户建站源码资源?  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  制作公司内部网站有哪些,内网如何建网站?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  建站ABC备案流程中有哪些关键注意事项?  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  建站之星价格显示格式升级,你的预算足够吗?  完全自定义免费建站平台:主题模板在线生成一站式服务  免费视频制作网站,更新又快又好的免费电影网站?  高端企业智能建站程序:SEO优化与响应式模板定制开发  红河网站制作公司,红河事业单位身份证如何上传?  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  网站企业制作流程,用什么语言做企业网站比较好?  建站主机无法访问?如何排查域名与服务器问题  建站之星微信建站一键生成小程序+多端营销系统  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  建站之星如何助力网站排名飙升?揭秘高效技巧  建站之星如何开启自定义404页面避免用户流失?  如何在香港免费服务器上快速搭建网站?  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  高防服务器租用如何选择配置与防御等级?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  如何通过FTP空间快速搭建安全高效网站?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  c# 在ASP.NET Core中管理和取消后台任务  广平建站公司哪家专业可靠?如何选择?  宝塔新建站点报错如何解决?  建站之星免费版是否永久可用?  如何在IIS中新建站点并解决端口绑定冲突?  ,交易猫的商品怎么发布到网站上去?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  网站制作公司排行榜,抖音怎样做个人官方网站  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  如何批量查询域名的建站时间记录?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  家具网站制作软件,家具厂怎么跑业务?  高端网站建设与定制开发一站式解决方案 中企动力  建站VPS配置与SEO优化指南:关键词排名提升策略  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  官网网站制作腾讯审核要多久,联想路由器newifi官网  大连 网站制作,大连天途有线官网? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。