• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C语言数据结构 栈的基础操作

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了数据结构c语言版栈,c语言栈,c语言栈的实现,c语言栈是什么,c语言栈的基本操作等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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_

</div>

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;
}

</div>

运行结果

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

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C语言数据结构 栈的基础操作
  • C语言 数据结构中栈的实现代码

相关文章

  • 2017-05-28常用的C语言排序算法(两种)
  • 2017-05-28C++多态的实现及原理详细解析
  • 2017-05-28C语言开发简易版扫雷小游戏
  • 2017-05-28vector, list, map在遍历时删除符合条件的元素实现方法
  • 2017-05-28C语言之双向链表详解及实例代码
  • 2017-05-28C语言中的malloc使用详解
  • 2017-05-28浅析c++ 宏 #val 在unicode下的使用
  • 2017-05-28C语言中堆空间的生成与释放详解
  • 2017-05-28基于稀疏图上的Johnson算法的详解
  • 2017-05-28优先队列(priority_queue)的C语言实现代码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C语言实现五子棋小游戏
    • C++实现动态分配const对象实例
    • C语言初学者代码中的常见错误与问题
    • CString,字符串,整数等相互转换方法(推荐)
    • C++基于递归和非递归算法判定两个二叉树结构是否完全相同(结构和数据都相同)
    • 内核线程优先级设置的方法介绍
    • 原码, 反码与补码基础知识详细介绍
    • C++实现图形界面时钟表盘代码
    • Cocos2d-x学习笔记之Hello World!
    • C++指针作为函数的参数进行传递时需要注意的一些问题

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有