链栈的定义、构建、入栈、出栈和取栈顶元素
一、链栈的定义:
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct StackNode
{ElemType data;struct StackNode *next;
}StackNode,*LinkStack;
二、初始化:
Status InitStack(LinkStack &S)
{//构建一个空栈,栈顶指针置空 S=NULL;return OK;
}
三、入栈:
算法步骤:
①为入栈元素e分配空间,用指针p指向;
②将新节点数据域置为e;
③将新节点插入栈顶;
④修改栈顶指针为p;
Status Push(LinkStack &S,int e)
{//在栈顶插入元素e; StackNode *p;p=new StackNode;//生成新的节点p->data=e;//将新的节点数据域置为e; p->next=S; //将新的节点插入栈顶;S=p;//修改栈顶指针p; return OK;
}
四、出栈:
算法步骤:
①判断栈是否为空,若空则返回ERROR;
②将栈顶元素赋给e;
③临时保存栈顶元素空间,以备释放;
④修改栈顶指针,指向新的栈顶元素;
⑤释放原栈顶元素空间;
Status Pop(LinkStack &S)
{//删除S的栈顶元素,用e返回其值LinkStack p;p=new StackNode;int e;if(S==NULL) return ERROR;//栈空;e=S->data;//将栈顶元素赋给e;p=S;//用p临时保存栈顶元素空间,以备释放;S=S->next;//修改栈顶指针;delete p;//释放原栈顶元素空间;return e;
}
五、取栈顶元素:
算法步骤:
①判断是否为空;
②直接返回栈顶值;
Status GetTop(LinkStack &S)
{//返回S的栈顶元素,不修改栈顶指针;if(S!=NULL)//栈非空;return S->data;//返回栈顶元素的值,栈顶指针不变;
}
六、主函数:
int main()
{LinkStack S;InitStack(S);printf("请输入元素个数:");int x;scanf("%d",&x);int e;printf("请输入元素:");for(int i=0;i<x;i++){scanf("%d",&e);Push(S,e);//在栈顶插入元素e;}printf("栈顶元素为:%d",GetTop(S));//返回S的栈顶元素,不修改栈顶指针;printf("\n");printf("元素遍历:");for(int i=0;i<x;i++){printf("%d ",Pop(S));//删除S的栈顶元素,用e返回其值}return 0;
}
七、完整代码:
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct StackNode
{ElemType data;struct StackNode *next;
}StackNode,*LinkStack;
Status InitStack(LinkStack &S)
{//构建一个空栈,栈顶指针置空 S=NULL;return OK;
}Status Push(LinkStack &S,int e)
{//在栈顶插入元素e; StackNode *p;p=new StackNode;//生成新的节点p->data=e;//将新的节点数据域置为e; p->next=S; //将新的节点插入栈顶;S=p;//修改栈顶指针p; return OK;
}
Status Pop(LinkStack &S)
{//删除S的栈顶元素,用e返回其值LinkStack p;p=new StackNode;int e;if(S==NULL) return ERROR;//栈空;e=S->data;//将栈顶元素赋给e;p=S;//用p临时保存栈顶元素空间,以备释放;S=S->next;//修改栈顶指针;delete p;//释放原栈顶元素空间;return e;
}
Status GetTop(LinkStack &S)
{//返回S的栈顶元素,不修改栈顶指针;if(S!=NULL)//栈非空;{return S->data;//返回栈顶元素的值,栈顶指针不变;}}int main()
{LinkStack S;InitStack(S);printf("请输入元素个数:");int x;scanf("%d",&x);int e;printf("请输入元素:");for(int i=0;i<x;i++){scanf("%d",&e);Push(S,e);//在栈顶插入元素e;}printf("栈顶元素为:%d",GetTop(S));//返回S的栈顶元素,不修改栈顶指针;printf("\n");printf("元素遍历:");for(int i=0;i<x;i++){printf("%d ",Pop(S));//删除S的栈顶元素,用e返回其值}return 0;
}
八、运行结果:
链栈的定义、构建、入栈、出栈和取栈顶元素相关推荐
- 剑指offer 31.栈的、压入弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是 ...
- 栈的操作(入栈、出栈)之一:顺序栈
栈操作原则 使用栈操作数据,必须遵循"先入后出"的原则: 栈操作之顺序栈 使用顺序表实现栈的存储结构,本质上是数组,数组的一端做栈底,另一端做栈顶: 一个数组其下标最低的位置可当做 ...
- 【Unity】渐入渐出的黑屏(白屏)过场动画最简单的实现
一个简单的黑屏动画,用于2D项目,效果类似慢眨眼.进/出房间时切换场景的衔接过渡. 这种效果的实现方式其实蛮多的,我能想到的包括用shader,用一张全黑Sprite覆盖屏幕,或者直接做成一个UI. ...
- 链栈的创建,入栈,出栈!
代码内容:链栈的创建,入栈,出栈! 数据元素为数字! 主要函数: void In(LinkStack L) //前插法建立含有n个数字的链栈 void Pop(LinkStack L, int e)/ ...
- 链栈的创建,入栈,出栈,获取栈顶元素
链栈的创建,入栈,出栈,获取栈顶元素 #include <stdio.h> #include <stdlib.h> #define Max 5 typedef struct L ...
- 数据结构与算法--举例分析法- 栈的压入弹出序列
举例分析 与上两篇问中画图方法一样,我们可以用举例模拟的方法思考分析复杂问题.当一眼不能看出问题的规律的时候,我们可以用几个具体的例子来模拟一下问题的过程.这样就和我们在程序出现问题时候的debug一 ...
- C++栈的初始化,入栈,出栈,获取栈顶元素等操作
栈的一些性质: 1.栈为空不可以出栈 2.栈顶元素先出 3.新元素插入栈顶 栈的初始化: #include<iostream> #include<string> using n ...
- C语言实现顺序栈的基本操作(初始化、判断空、入栈、出栈、获取栈顶元素)
//顺序栈的基本操作 #include<stdio.h> #define MaxSize 50 typedef int ElemType; //定义栈结构体 typedef struct ...
- 【数据结构】栈详解——压栈/入栈 | 弹栈/出栈 | 获取栈顶元素
栈 顺序栈 栈的定义 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈, ...
最新文章
- 浅析Node模块中module.exports与exports的关系
- Web自适应布局你需要知道的所有事儿
- 转:Webkit Flex伸缩盒模型属性备忘
- oracle 怎么备份sqlserver数据库,Oracle和sqlserver数据库的备份与恢复
- android double值排序,android根据Double类型数据经纬度算出距离再根据距离实现排序功能...
- Terracotta - 分布式共享对象
- 嵌入式系统的接口类型有哪些
- NetOps Defined
- Java源码分析之CountDownLatch
- DRM在Android中
- [LuoGu] P3957 跳房子
- CNCAP2021版 主动安全ADAS系统试验方法
- 方法finalizer()的应用
- backtrader 自定义indicator_BackTrader回测工具(一)
- 全局负载均衡GSLB
- Excel自定义排序(可按某一列排序)
- 怎样引流推广?一文讲透引流的核心秘密
- 15个常用excel函数公式_会计财务最常用的15个公式函数,建议收藏
- python中iadd与add_如何为Python属性实现-uyu iadd_uu
- 一些vue功能和css样式