栈(Stack)是一种特殊的线性表,其插入和删除操作均在表的一端进行,是一种运算受限的线性表
栈顶(top)是栈中允许插入和删除的一端。
栈底(bottom)是栈顶的另一端
顺序栈:

#include<stdio.h>
#include<stdlib.h>
#define Stack_Init_Size 100 //栈容量
#define StackIncrement 10 //栈增量
#define OVERFLOW -1
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int SElemType;
typedef int Status;
typedef struct {SElemType *base;SElemType *top;int stacksize;
}SqStack;
Status InitSqStack(SqStack* S)
{S->base = (SElemType*)malloc(Stack_Init_Size * sizeof(SElemType));S->top = S->base;S->stacksize = Stack_Init_Size;return OK;
}
Status Push(SqStack* s, SElemType e)
{if (s->top - s->base >= s->stacksize){s->base = (SElemType*)realloc(s->base,((int)s->stacksize + StackIncrement) * sizeof(SElemType));if (s->base==NULL)exit(OVERFLOW);s->top = s->base + s->stacksize;s->stacksize += StackIncrement;}*(s->top) = e;s->top++;return OK;
}
SElemType Pop(SqStack* s)
{SElemType e;if (s->top == s->base){return ERROR;}else{s->top--;//注意出栈是先--e = *(s->top);return e;}
}
Status Destroy(SqStack* S)
{free(S->base);S->base = NULL;S->top = NULL;S->stacksize = 0;return OK;
}
Status Clear(SqStack* S)
{S->top = S->base;return OK;
}
Status Is_empty(SqStack* S)
{if (S->top == S->base)return TRUE;elsereturn FALSE;
}
int Length(SqStack* S)
{return (int)(S->top - S->base);
}
void StackTraverse(SqStack* s)
{SElemType* p;p = s->top;while (p!=s->base){ p--;printf("%d\n", *(p));}
}
SElemType GetTop(SqStack* s)
{s->top--;return *s->top;
}
int main()
{SqStack* s=(SqStack*)malloc(sizeof(SqStack));InitSqStack(s);for (int i = 0; i < 10; ++i){Push(s, i);}printf("长度: %d\n", Length(s));for (int i = 0; i < 10; ++i){printf("%d\n", Pop(s));}return 0;
}

链式栈

#include<stdio.h>
#include<stdlib.h>
#define Stack_Init_Size 100 //栈容量
#define StackIncrement 10 //栈增量
#define OVERFLOW -1
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int SElemType;
typedef int Status;
typedef struct SNode {SElemType data;struct  SNode* next;
}SNode,*LinkStack;
LinkStack InitStack()//注意这个初始化方式!!!!!!
{LinkStack s = (SNode*)malloc(sizeof(SNode));if (!s)exit(OVERFLOW);s->next = NULL;return s;
}
void Push(LinkStack s, SElemType e)
{LinkStack p = (SNode*)malloc(sizeof(SNode));if (p == NULL)exit(OVERFLOW);p->data = e;p->next = NULL;p->next = s->next;s->next=p;//与单链表的头插法相似
}
SElemType Pop(LinkStack s)
{LinkStack q;q = s->next;SElemType e= q->data;s->next = q->next;  free(q);//删除单链表的第一个元素return e;
}
void DestroyStack(LinkStack s)
{free(s);
}
void ClearStack(LinkStack s)
{s->next = NULL;
}
Status StackEmpty(LinkStack s)
{if (s->next == NULL)return TRUE;else{return FALSE;}
}
int StackLength(LinkStack s)
{int i = 0;SNode* p = s->next;while (p!=NULL){i++;  p = p->next;}return i;
}
SElemType GetTop(LinkStack l)
{return l->next->data;
}
void StackTravers(LinkStack s)
{SNode* p = s->next;while (p != NULL){printf("%d ", p->data);p = p->next;}
}
int main()
{LinkStack s = (SNode*)malloc(sizeof(SNode));s=InitStack();for (int i = 0; i < 10; i++){Push(s, i);}Pop(s);StackTravers(s);return 0;
}

数据结构之栈(后进先出表)相关推荐

  1. 顺序表输入栈元素c语言,C语言数据结构之栈简单操作

    C语言数据结构之栈简单操作 实验: 编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能: (1)初始化顺序栈 (2)插入元素 (3)删除栈顶元素 (4)取栈顶元素 (5)遍 ...

  2. 数据结构-栈(先进后出表)

    //数据结构-栈(先进后出表) #include<stdio.h> #define MaxSize 100 typedef char ElemType; typedef struct { ...

  3. c++怎么实现数字数组的删除数字_C/C++数据结构:栈结构解析,最简单解析,让你一遍就会...

    上一章节针对于C语言最基本的数据结构链式结构体做了解析,不清楚的可以回顾一下.本章节主要针对于C语言的基础数据结构栈做以解析. 数据结构之栈 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅 ...

  4. 数据结构之 栈 (Python 版)

    数据结构之 栈 (Python 版) -- 利用线性表实现栈 栈的特性: 后进先出 基于顺序表实现栈 1 class SStack(): 2 3 ''' 4 基于顺序表 实现的 栈类 5 ''' 6 ...

  5. C语言【数据结构】栈和队列【OJ题(C++)、选择题】

    目录 一.OJ题 1.225. 用队列实现栈 2.232. 用栈实现队列 3.622. 设计循环队列 4.20. 有效的括号 二.选择题 1.下列关于栈的叙述正确的是(B) 2.一个栈的入栈序列为AB ...

  6. 数据结构--链栈的c语言实现(超详细注释/实验报告)

    数据结构–链栈的c语言实现(超详细注释/实验报告) 知识小回顾 栈(Stack)作为一种限定性线性表,是将线性表的插入和删除操作限制为仅在表的一端进行,通常将表中允许进行插入.删除操作的一端成为栈顶( ...

  7. 数据结构:栈(Stack)

    数据结构:栈(Stack) 栈是一种数据结构,是一种只能在一端进行添加和删除,受限制的线性表.先进入的元素被压入栈顶,最后进入的元素在栈顶,又称LIFO(后进先出)线性表. 栈需要下面几种操作 入栈 ...

  8. Java数据结构之栈详解

    栈的定义: 栈(stack)是一种用于存储数据的简单数据结构.栈一个有序线性表,只能在表的一端(PS:栈顶)执行插人和删除操作.最后插人的元素将被第一个删除.所以,栈也称为后进先出(Last In F ...

  9. c语言堆栈基本代码入栈出栈_C语言实现常用数据结构:栈-顺序栈实现(第6篇)...

    栈 栈是一种特殊的线性表,其特性是仅能在表尾进行插入或删除的操作,栈中元素的操作是按照后进先出的原则进行,因此栈又称为后进先出线性表(Last In First Out,LIFO数据结构).栈顶:表尾 ...

  10. 数据结构习题——栈和队列(二)

    第3章  栈和队列    一.填空题 1.  线性表.栈和队列都是 线性 结构,可以在线性表的 任何 位置插入和删除元素:对于栈只能在 栈顶 插入和删除元素:对于队列只能在 队尾 插入和 队头 删除元 ...

最新文章

  1. 【mDNS】本地DNS解析协议
  2. Link Cut Tree 学习笔记
  3. Myeclipse编辑器简单使用整理
  4. いちがつ(2017/1)
  5. java pingpong_面试题。线程pingpong的输出问题
  6. 高性能Javascript HTML集合访问的学习笔记
  7. python自动部署环境_在 CentOS 上初始化 Python 环境的自动部署脚本
  8. postgresql获取表最后更新时间(通过触发器将时间写入另外一张表)
  9. Ubuntu安装GoogleTest框架并测试C++代码
  10. CVPR 2017精彩论文解读:综合使用多形态核磁共振数据的3D生物医学图像分割方法 | 分享总结...
  11. Nagios社区真有意思
  12. 安防意识增强 澳洲迈向新发展
  13. 职高计算机专业个人鉴定范文大全,职高个人自我鉴定300字左右
  14. 从这里开始你的游戏黑客入门的之旅吧
  15. Kodi+Alist v3 挂载阿里云盘他人分享链接打造在线影视库
  16. logrus固定当天日志文件名称源码修改
  17. 一个中专生:我在华为面试的真实经历,转
  18. 汉语拼音的模糊音扩展(用于搜索纠错)
  19. 深度ip转换器手机版app_一键清理全能版app下载-一键清理全能版app手机版 v1.0.0...
  20. 【学习笔记】兄弟连Linux教程摘要

热门文章

  1. 【心田花开】三年级语文上册南宋古诗鉴赏
  2. 面对互联网风口下的人口老龄化,AI智能如何做好医疗健康管理?
  3. 4k笔记本刺眼睛_2020戴尔笔记本怎么选?哪个系列好?附5款高销量戴尔笔记本电脑型号推荐!【超高性价比】...
  4. 阿里easyexcel通过模板导出excel
  5. MSCode微服务平台框架基于SpringCloud、SpringCloud Alibaba、SpringBoot和Activiti7工作流,快速开发办公OA、CRM、ERP、电商、信息管理等业务系统
  6. panda3d 键盘移动场景
  7. 电脑只有浏览器可以上网其他软件都无法联网怎么办?
  8. 手机游戏《魔塔》实现细节——(1)需求收集
  9. 记一次组装电脑的经历
  10. [Ynoi2019]魔法少女网站