数据结构-栈
内存分为静态内存(在栈里分配)和动态内存(在堆里分配)。
栈和堆表示分配数据的方式。
栈:静态内存,以压栈和出栈的方式分配内存。
堆:堆排序的方式分配内存。
https://blog.csdn.net/zichen_ziqi/article/details/80807989
什么是栈
一种可以实现“先进后出”的存储结构。
静态栈 动态栈
区别:
1.静态栈必须提前确定栈的大小(有限的),并且都是连续的.;动态栈可以无限大小(内存够的情况下),并且是不连续的.
2**.静态栈可以复用顺序表的代码;动态栈可以复用单链表**的代码。
静态栈
选择线性表的尾部(头部)作为栈顶,也就是说只能允许在这一端进行操作;相应的在进行出栈操作时也是从线性表的尾部(头部)开始。
动态栈
元素之间不连续
操作
出栈:栈的删除操作
压栈:进栈,栈的插入操作
栈的标准库操作
头文件: #include< stack > 。定义:stack< int > s;
s.empty(); //如果栈为空则返回true, 否则返回false;
s.size(); //返回栈中元素的个数
s.top(); //返回栈顶元素, 但不删除该元素
s.pop(); //弹出栈顶元素, 但不返回其值
s.push(); //将元素压入栈顶
动态栈的操作实现
先定义一个节点数据类型结构体,里面有节点值和下一个节点地址两个成员。
再定义栈的结构体,里面有一个栈顶节点(指向栈顶元素),一个栈尾节点(指向栈尾元素的下一个没有实际含义的)。
操作
初始化 initStack(PSTACK)
栈的插入
栈的遍历输出
栈的删除
栈的清空
void initStack(PSTACK s)
定义栈结构体变量,并不意味着栈已经创建好了。此时该对象指向的是垃圾值,
需要对其初始化(栈尾和栈头指向同一个没有实际含义的节点(栈尾的下一个))。
造出一个空栈。
参数:栈指针对象(普通栈对象取地址)
步骤:
通过malloc函数动态创建这个空间;
栈首等于栈尾;
栈首的下个节点的地址为空。
void pushStack(PSTACK s,int val)
参数:栈指针对象(普通栈对象取地址)、新节点的数据值
步骤:
动态创建一个节点,数据域是数据值,指针域指向原来的栈首。栈首指针域指向新节点。
void traverse(PSTACK s)
参数:栈指针对象(普通栈对象取地址)
步骤:
定义一个指针节点为栈首
当该节点不为栈尾节点时,输出当前节点数据值。循环输出。
bool popStack(PSTACK s,int *pVal)
作用:出栈一次,把要出栈的元素存入 pVal形参指向的变量。成功,返回该变量值。失败 false.
步骤:
判断是否为空栈
定义一个节点指向ptop,
ptop指向该栈顶节点的下一位
释放 该节点
赋空该节点
测试:
void clearStack(PSTACK s)
功能:清空栈
步骤:判断是否为空栈
定义两个节点p、q,初始一个p指向栈顶,一个q初始为空,即将指向栈顶的下一个节点。
当p!=栈尾,q指向p的下一个节点。释放p。p等于q。