数据结构——栈(c语言)
来源:互联网 发布:java微信支付查询订单 编辑:程序博客网 时间:2024/05/22 06:35
1 栈的概念
栈(stack)是限定仅在表尾进行插入和删除操作的线性表。
栈的特点是:后进先出。
2 栈的API
3 栈的顺序存储结构
#include <stdio.h>#include <stdlib.h>#define STACKINITSIZE 100 //存储空间初始大小#define STACKINCREMENT 10 //存储空间分配增量enum return_status{ TURE = 1, OK = 2, FALSE = 0, ERROR = -1, OVERFLOW = -2, STACKEMPTY = -3, EMPTY = 1, NO_EMPTY = 0};typedef struct SqStack { int *base; /*构造之前和销毁之后,base为NULL,用于指示存储数据的数组的地址*/ int *top; //栈顶指针 int stacksize; //当前已经分配的存储空间大小}SqStack;int InitStack(SqStack **s) /*注意:凡是对指针的修改,均需要输入二级指针,这里输入的是指针的地址*/{ *s = (SqStack *)malloc(sizeof(SqStack)); /*申请栈指针*/ if (!(*s)) exit(OVERFLOW); (*s)->top = (*s)->base = (int *)malloc(STACKINITSIZE * sizeof(int)); /*申请内容存储空间*/ (*s)->stacksize = STACKINITSIZE; return OK;}int StackEmpty(SqStack *s){ if (s->top == s->base) return EMPTY; else return NO_EMPTY;}void Push(SqStack *s, int value) /*将value压入栈中*/{ if (s->top - s->base >= s->stacksize) /*如果栈满了,追加存储空间*/ { s->base = (int *)realloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(int)); if (!s->base) exit(OVERFLOW); s->top = s->base + s->stacksize; /*重新设置栈顶指针*/ s->stacksize += STACKINCREMENT; /*设置栈的存储空间大小*/ } *(s->top++) = value;}void Pop(SqStack *s, int *e){ if (StackEmpty(s)) { /*判断是否栈空*/ printf("ERROR:当前栈为空!\n"); exit(STACKEMPTY); } *e = *(--s->top); /*top指针减1,然后取出元素*/}int StackLength(SqStack *s){ int len = 0; int *top, *base; top = s->top; base = s->base; while (top-- != base) /*如果top不等base,则长度+1,且 top--*/ { len++; } return len;}void ClearStack(SqStack *s){ /*直接将栈顶指针指向栈顶,等于栈清空*/ s->top = s->base;}void DestroyStack(SqStack **s ){ (*s)->top = NULL; /*free之前将指针指向NULL,防止野指针*/ free((*s)->top); (*s)->base = NULL; free((*s)->base); *s = NULL; free(*s);}int main(){ SqStack *s = NULL; /*初始化*/ if (InitStack(&s)) printf( "堆栈初始化完成!\n" ); /*入栈*/ Push(s, 10); Push(s, 20); Push(s, 30); Push(s, 40); /*出栈*/ int val = 0; Pop(s, &val); printf("val = %d\n", val); Pop(s, &val); printf("val = %d\n", val); /*长度判断*/ int len = 0; len = StackLength(s); printf("len = %d\n", len); Push(s, 50); Push(s, 60); Push(s, 70); Push(s, 80); len = StackLength(s); printf("len = %d\n", len); /*清空栈*/ ClearStack(s); if (StackEmpty(s)) printf("当前栈为空!\n"); /*销毁栈*/ DestroyStack(&s); system("pause"); return 0;}
阅读全文
0 0
- 数据结构——栈(c语言)
- C语言数据结构——栈
- 数据结构——双端堆(C语言)
- 数据结构——左高树(C语言)
- 数据结构——二项堆(C语言)
- 数据结构(c语言)—笔记
- 数据结构(三)——栈(C语言实现)
- 数据结构——链栈的实现(C语言)
- 数据结构(C语言)
- 数据结构C语言实现系列[2]——栈
- 数据结构C语言实现系列[2]——栈
- 数据结构——顺序栈(C语言实现)
- 数据结构C 语言描述——实现栈的基本功能
- C语言数据结构——栈、行编辑程序
- 数据结构(二)——链表(C语言实现)
- 数据结构(四)——队列(C语言实现)
- 数据结构——队列的链式实现(C语言)
- 数据结构——双向链表(C语言)
- tfidf给每个词加权重
- 用一个小例子来认识Java多态
- 设计模式学习笔记六:.NET反射工厂
- SSL2674 2017年8月9日提高组T2 覆盖(dp)
- 关于Neo4j数据库连接出现的问题
- 数据结构——栈(c语言)
- 【PAT】【Advanced Level】1058. A+B in Hogwarts (20)
- centos 6.9 安装 Discuz3.2X 论坛
- String初探
- 笔记——多重背包
- Web Animations API (JS动画利器)
- JAVA运行时异常及常见的5中RuntimeExecption
- linux中的文件操作代码一
- eclipse创建maven项目