数据结构 创建栈 压栈 删除栈顶元素 清空栈 遍历栈 例子
2017-09-20 21:16
309 查看
本例子讲述了如何创建一个栈,压栈即往栈里插入一个结点,删除栈顶元素,以及对栈里的结点进行清空,遍历栈里的结点
1 初始化栈
初始化栈时为栈顶和栈底指向同一个结点,即栈顶指向栈底
2 压栈
压栈即往栈里插入一个结点,因为栈里插入元素只能插入到栈顶,所以压栈的步骤是,
先创建一个新结点,然后把数据赋值到新结点数据域中,最后将栈顶指向新结点
3 遍历栈
因为栈时先进后出,所以栈顶元素先出来,栈底元素后出来。
先定义一个新结点指针,新结点指向栈顶元素,进入while循环判断,如果新结点不等于栈底,则输出数据域,再将新结点指向新结点的下一个结点,以此进行
循环判断
4 删除栈结点
因为删除栈结点时,必选从栈顶开始删除,所以删除一个栈元素,就是将栈顶元素删除,使栈顶指向下一个结点
本程序的步骤,1 初始化栈
2 往栈里插入五个结点,然后进行遍历输出,会输出5个结点的数据
3 删除一个栈元素,然后进行遍历输出,会输出4个节点的的数据
4 将栈进行清空,然后进行遍历输出,会提示栈为空
程序运行结果:
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <errno.h> typedef struct Node { int data; //数据域 struct Node *pNext; //指针域 }NODE, *PNODE; typedef struct Stack { PNODE pTop; //栈顶 PNODE pBottom; //栈底 }TSTACK, *PSTACK; //初始化栈 int init(PSTACK _pSt) { _pSt->pTop = (PNODE)malloc(sizeof(NODE)); //为栈顶分配内存 if(NULL == _pSt->pTop) { printf("----malloc fail errno= %d\n", errno); return -1; } else { _pSt->pBottom = _pSt->pTop; //栈底指向了栈顶 _pSt->pBottom->pNext = NULL; //将栈底指针域赋为空 } return 0; } //压栈,往栈里写数据 int push_stack(PSTACK _pSt, int _iVal) { PNODE pNew = (PNODE)malloc(sizeof(NODE)); if(NULL == pNew) { printf("----Push_stack fail, errno\n", errno); return -1; } else { pNew->data = _iVal; //将待入栈的数据写入数据域中 pNew->pNext = _pSt->pTop; //将新结点的指针域指向之前的栈顶 _pSt->pTop = pNew; //栈顶指向新结点 } } //判断栈是否为空栈 int Is_empty(PSTACK _pSt) { if(_pSt->pTop == _pSt->pBottom) //如果栈顶与栈底相等说明栈为空 { return 1; } else { return 0; } } //对栈进行遍历 void ergodic_stack(PSTACK _pSt) { if(1 == Is_empty(_pSt)) { printf("----This stack is empty\n"); } else { PNODE Temporary_node; Temporary_node = _pSt->pTop; while(Temporary_node != _pSt->pBottom) //不等于栈底 { printf("%d ", Temporary_node->data); Temporary_node = Temporary_node->pNext; } printf("\n"); } } //删除栈顶元素 void pop_stack(PSTACK _pSt) { if(1 == Is_empty(_pSt)) { printf("----This stack is empty\n"); } else { PNODE Temporary_node; Temporary_node = _pSt->pTop; _pSt->pTop = _pSt->pTop->pNext; free(Temporary_node); Temporary_node = NULL; } } //清空栈 void clear_stack(PSTACK _pSt) { if(1 == Is_empty(_pSt)) { printf("----This stack is already empty\n"); } else 4000 { PNODE p = _pSt->pTop; PNODE q = NULL; while(p != _pSt->pBottom) { q = p->pNext; free(p); p = q; } _pSt->pTop = _pSt->pBottom; //栈顶指向栈底 } } int main(int argc, char* argv[]) { TSTACK St; int iVal = 0; int i = 0; if(-1 == init(&St)) { return -1; } while(i < 5) { printf("----Please input insert val to stack\n"); scanf("%d", &iVal); push_stack(&St, iVal); i++; } ergodic_stack(&St); //对栈进行遍历 pop_stack(&St); ergodic_stack(&St); //删除栈顶元素后再次进行遍历 clear_stack(&St); ergodic_stack(&St); //清空栈元素后再次进行遍历 return 0; }
1 初始化栈
初始化栈时为栈顶和栈底指向同一个结点,即栈顶指向栈底
2 压栈
压栈即往栈里插入一个结点,因为栈里插入元素只能插入到栈顶,所以压栈的步骤是,
先创建一个新结点,然后把数据赋值到新结点数据域中,最后将栈顶指向新结点
3 遍历栈
因为栈时先进后出,所以栈顶元素先出来,栈底元素后出来。
先定义一个新结点指针,新结点指向栈顶元素,进入while循环判断,如果新结点不等于栈底,则输出数据域,再将新结点指向新结点的下一个结点,以此进行
循环判断
4 删除栈结点
因为删除栈结点时,必选从栈顶开始删除,所以删除一个栈元素,就是将栈顶元素删除,使栈顶指向下一个结点
本程序的步骤,1 初始化栈
2 往栈里插入五个结点,然后进行遍历输出,会输出5个结点的数据
3 删除一个栈元素,然后进行遍历输出,会输出4个节点的的数据
4 将栈进行清空,然后进行遍历输出,会提示栈为空
程序运行结果:
相关文章推荐
- 数据结构--栈的构造、插入、删除、得到栈顶元素操作
- 数据结构:线性表(顺序存储)顺序栈类(实现创建,输出,入栈出栈,读栈顶元素功能)
- 单向循环链表创建、遍历、插入、删除、查找(按位置,按元素值)、清空、销毁
- 栈的创建、返回栈顶元素、删除栈顶元素、插入栈顶元素
- c语言数据结构中循环队列操作,包括初始化,创建,清空销毁,增添,删除,求队长,遍历等等
- linux下文件夹的创建、复制、剪切、重命名、清空和删除命令
- js动态创建表格,删除行列的小例子
- 动态的创建一个元素createElement及删除一个元素
- 通过js动态清空、增加、删除、修改下拉框中的元素
- 数据结构题典002:删除单链表中最大元素所在结点(ANSI C)
- 数据结构 单链表创建 插入 删除
- dom编程-动态创建、删除元素
- linux下文件夹的创建、复制、剪切、重命名、清空和删除命令
- 数据结构-链表创建,删除,插入,反转,连接
- python 文件的读取、创建、追加、删除、清空
- 数据结构 二叉排序树的创建,查找,插入,删除
- ubuntu创建、删除文件及文件夹,强制清空回收站方法
- 数据结构 二叉排序树的创建、查找、删除
- Java集合删除元素ArrayList为例子分析
- 数据结构:有人设计以下算法用于删除整数顺序表L中所有值在[x,y]范围内的元素,该算法显然不是高效的,请设计一个同样功能的高效算法。