数据结构之栈

<数据结构>——栈 📚参考资料:《数据结构C语言版》-严蔚敏 一、栈 首先,我们了解一下什么是栈? 栈是限定仅在表尾进行插入或删除操作的线性表。 表尾为栈顶,表头为栈底,不含元素的空表称为空栈。 例如, 洗干净的盘子总是逐个往上叠放在已经洗好的盘子上面 , 而用时从上往下逐个取用 还有一些案例也利用了栈: 括号的检验 我们来看这些括号,给它们标号为1-4,当出现1和2时,我们更想要先出现3,再出现4。而由于1与3配对,2与4配对,所以我们其实对于2的需求感强于对1的需求感。 1先进... 阅读详情

No.1:栈的定义

栈(stack)是一种只能在一端进行插入(push)或删除(pop)操作的线性表。其中允许进行插入或删除操作的一端称为栈顶。固定不变的一端是栈底。插入一般称为入栈,删除则称为出栈。栈也被称为先进后出(FILO)表。

No.2:栈的存储

栈主要有两种存储结构,顺序栈和链式栈。

No.3:栈的操作

栈的主要操作包括入栈、出栈、判断栈空栈满、获取栈顶元素、获取栈中元素数量等。

No.4:顺序实现

这里给出了一个Java实现的泛型顺序栈ArrayStack,不足之处,多谢批评指正。

public class ArrayStack<T> {
	
	/**
	 * 默认构造函数
	 */
	public ArrayStack() {
		top = -1;
		data = (T[]) new Object[size];
	}
	
	/**
	 * 构造函数
	 * @param size 初始化栈大小
	 */
	public ArrayStack(int size) {
		top = -1;
		data = (T[]) new Object[size];
	}
	
	/**
	 * 入栈操作
	 * @param value 入栈数据
	 */
	public void push(T value) {
		if(isFull()) {
			throw new ArrayIndexOutOfBoundsException();
		} else {
			data[++top] = value;
		}
	}
	
	/**
	 * 出栈操作
	 * @return 出栈数据
	 */
	public T pop() {
		T temp = null;//这里估计存储基本数据类型的时候会出现问题的
		if(isEmpty()) {
			throw new ArrayIndexOutOfBoundsException();
		} else {
			temp = data[top--];
		}
		return temp;
	}
	
	/**
	 * 获取栈顶数据
	 * @return 栈顶数据
	 */
	public T getTop() {
		return data[top];
	}
	
	/**
	 * 获取栈中存储数据的长度
	 * @return 栈中存储数据的长度
	 */
	public int size() {
		return top + 1;
	}
	
	/**
	 * 判断栈空
	 * @return 若空返回true,否则返回false
	 */
	public boolean isEmpty() {
		return top == -1;
	}
	
	/**
	 * 判断栈满
	 * @return 若满返回true,否则返回false
	 */
	public boolean isFull() {
		return top == data.length - 1;
	}
	
	/**
	 * 打印栈中数据
	 * @throws IndexOutOfBoundsException 空栈打印异常
	 */
	public String toString() {
		if(isEmpty()) {
			throw new IndexOutOfBoundsException();
		}
		String temp = "[";
		for(int i = top; i >= 0; --i) {
			if(i == 0) {
				temp += data[i].toString() + "]";
			} else {
				temp += data[i].toString() + ", ";
			}
		}
		return temp;
	}
		
	private int top;//栈顶指针
	private int size = 100;//默认栈数组大小
	private T[] data;//栈数组
	
	/**
	 * 测试主函数
	 */
	public static void main(String[] args) {
		ArrayStack<Integer> stack = new ArrayStack<Integer>();
		for(int i = 0; i < 50; ++i) {
			stack.push(i + 1);
		}
		for(int i = 0; i < 40; ++i) {
			stack.pop();
		}
		System.out.println(stack.toString() + "--" + stack.size() + "--");
	}
}

No.5:链式实现

这里给出了一个Java实现的泛型顺序栈LinkedStack,不足之处,多谢批评指正。

public class LinkedStack<T> {//链栈
	
	/**
	 * 默认构造函数
	 */
	public LinkedStack() {
		top = null;
		currentSize = 0;
	}
	
	/**
	 * 构造函数
	 * @param size 栈初始化大小
	 */
	public LinkedStack(int size) {
		top = null;
		currentSize = 0;
		this.size = size;
	}
	
	/**
	 * 入栈
	 * @param value 指定数据
	 */
	public void push(T value) {
		if(isFull()) {
			throw new ArrayIndexOutOfBoundsException();
		}
		if(currentSize == 0) {//栈底结点
			top = new Node<T>(value, null);
		} else {
			top = new Node<T>(value, top);
		}
		++currentSize;
	}
	
	/**
	 * 出栈
	 * @return 出栈的数据
	 */
	public T pop() {
		if(isEmpty()) {
			throw new ArrayIndexOutOfBoundsException();
		}
		Node<T> temp = top;
		top = top.next;
		--currentSize;
		return temp.data;
	}

	/**
	 * 获取栈顶数据
	 * @return 栈顶数据
	 */
	public T getTop() {
		return top.data;
	}
	
	/**
	 * 链栈存储数据长度
	 * @return 链栈存储数据长度
	 */
	public int size() {
		return currentSize;
	}
	
	/**
	 * 判断栈空
	 * @return 栈空则返回true,否则返回false
	 */
	public boolean isEmpty() {
		return currentSize == 0 && top == null;
	}
	
	/**
	 * 判断栈满
	 * @return 栈满则返回true,否则返回false
	 */
	public boolean isFull() {
		return currentSize == size;
	}
	
	/**
	 * 打印链栈中的数据
	 */
	public String toString() {
		if(isEmpty()) {
			throw new IndexOutOfBoundsException();
		}
		String temp = "[";
		Node<T> p = top;
		for(int i = 0; i < currentSize; ++i) {
			
			if(i == currentSize - 1) {
				temp += p.data.toString() + "]";
			} else {
				temp += p.data.toString() + ", ";
			}
			p = p.next;
		}
		return temp;
	}
	
	private Node<T> top;//栈顶指针
	private int currentSize;//栈中存储数据长度
	private int size = 100;//栈的初始大小
	
	private class Node<T> {//结点
		public Node(T data, Node<T> next) {
			this.data = data;
			this.next = next;
		}
		
		private T data;//数据域
		private Node<T> next;//指针域
	}
	
	public static void main(String[] args) {
		LinkedStack<String> stack = new LinkedStack<String>();
		System.out.println("栈空?[" + stack.isEmpty() + ", " + stack.size() + "]");
		for(int i = 0; i < 100; ++i) {
			stack.push(i + 1 + "");
		}
		System.out.println("栈满?[" + stack.isFull() + ", " + stack.size() + "]");
		for(int i = 0; i < 90; ++i) {
			stack.pop();
		}
		System.out.println("[" + stack.isEmpty() + ", " + stack.size() + "]");
		System.out.println(stack.toString() + "," + stack.size());
	}
}

PC网站实现微信扫码登录功能(二) 上篇我们介绍了怎么申请账号以及最后拿到appId和appSecret,如果有不清楚的可以看一下 PC网站实现微信扫码登录功能(一) 下面我就来说一下怎样在PC端怎么实现扫码登录功能。 一、进入官方文档网站 https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html 其实官网对过程描述的已经非常细致了。并且提供了两种扫码方式。一种是跳转二维码扫描页面,另一种是内嵌式二维码。大家可以 阅读详情

相关推荐

VisionMaster位置修正功能深度解析:如何让找圆工具自动跟随移动目标?

本文深度解析海康威视VisionMaster平台的位置修正功能,重点介绍如何通过模板匹配与找圆工具的智能联动实现移动目标的动态追踪。文章详细阐述了工业视觉检测中的坐标系同步原理、模板匹配配置技巧及异常处理策略,为工程师提供了一套完整的工业级解决方案。

uu89012的博客 281

数据结构--栈(FILO)

使用的是数组,c++中的STL是非常好用的,关于栈,生活中也有很多这样的例子,最典型的是摞盘子。 使用回文字符串探究栈的作用,“aha”和“ahaha”均是回 文,但“ahah”不是回文。通过栈这个数据结构我们将很容易判断一个字符串是否为回文。通过读取字符串借助栈来解决这个问题。 代码: #include #include #include using namespace std; in

To-nemy 8934

Surface Pro 4/5/6/7保姆级黑苹果安装:从Windows分区到OC引导配置全流程(含EFI文件替换避坑)

本文详细介绍了在Surface Pro 4/5/6/7上安装黑苹果的全流程,包括Windows分区、OC引导配置和EFI文件替换等关键步骤。通过实战经验分享,帮助用户避开常见陷阱,实现Windows与macOS双系统完美共存,特别适合对黑苹果安装感兴趣的Surface Pro用户。

weixin_30300225的博客 1370

【数据结构】栈是什么?从0理解栈的数据结构

在数据结构的学习中,栈是一种非常重要的结构。无论你是否是计算机专业,栈的概念其实并不复杂。本篇文章将帮助你从零理解栈的数据结构,了解它的基本用途、实际应用以及如何在C++中实现栈操作。

XuanRan的博客 4543

保姆级图解:FD-SOI工艺流程中的关键三步(外延生长、应变硅、HKMG)

本文详细解析了FD-SOI工艺流程中的三大关键技术:外延生长、应变硅工程和HKMG集成。通过选择性外延生长技术优化接触电阻,利用应变硅提升载流子迁移率,并结合先栅高k金属栅工艺实现精准栅极控制,FD-SOI技术在智能手机处理器和自动驾驶芯片制造中展现出卓越的低功耗与高性能平衡。

weixin_29267307的博客 490

ai获客系统功能代码

AI 获客系统是一个复杂的体系,以下为你提供一个简化的 Python 示例,聚焦于客户行为分析与销售线索筛选功能,模拟实现从多渠道收集数据后的初步处理流程。假设已有从官网、线上商城等渠道收集到的客户数据,以字典列表形式存储,每个字典包含客户基本信息及购买行为数据。通过分析客户购买频率与金额,筛选出高价值销售线索。python上述代码仅为基础示例,实际 AI 获客系统还涉及更复杂的数据采集、清洗、存储,以及运用机器学习算法进行深度客户洞察等功能。

weixin_ggwwsscc的博客 892

【数据结构】栈的详解

栈的结构体其实和顺序表差不多,一个动态开辟的数组,一个栈的容量。注意 top 我们要决定它指向栈顶还是栈顶的下一个元素。如果top初始化为0,则它指向栈顶的下一个元素。如果top初始化为-1,则它指向栈顶元素。我比较喜欢初始化为0,1是top还可以表示元素的个数,可以用来判断栈是否满了。2是插入元素的时候直接在top的位置插入就行,然后再top++即可。这里根据大家喜好设定就行。int top;} ST;

fighting小泽的博客 3433

华为OD新系统机试真题-文章特征提取

华为OD机试新系统真题 【文章特征提取】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统机试真题【文章特征提取】

qq_45776114的博客 729

数据结构 栈

摘要 栈是一种后进先出(LIFO)的线性数据结构,仅允许在栈顶进行插入(push)和删除(pop)操作。其核心特性包括:仅操作栈顶、不支持随机访问、默认基于deque实现。栈的提出源于1950年代鲍尔团队对逆波兰表达式计算和函数调用机制的研究,现广泛应用于程序调用栈、表达式求值、括号匹配等场景。C++中可通过STL的std::stack或手动数组实现栈操作,基本功能包括压栈、弹栈、判空等。例题B3758展示了栈在括号匹配中的典型应用——通过栈统计未匹配括号数量,动态补全成合法序列。栈的高效性使其成为算法和系

syshrgjdkdh的博客 2240

android 如何分析应用的内存(十六)——使用AS查看Android堆

在前面,先介绍了如何使用jdb和VS code查看应用栈相关内容。本文将介绍,如何查看堆中的内容。

安仔的博客 4254

Yocto系列讲解[入门篇] 1 - 快速入门熟悉Yocto的构建

yocto quick start up带大家快速上手

fulinux的博客 5万+

数据结构之——栈

数据结构之——栈 一:栈的定义: 栈是限定是限定仅在表位进行插入和删除操作的线性表,栈又称为先进后出(Last In First Out)的线性表,简称LIFO结构。 栈顶:允许插入和删除的一端称为栈顶。 栈底:不可以进行插入和删除操作。 空栈:不含任何数据元素的栈称为空栈。 理解栈的定义需要注意几点: 1:它是一个线性表,即说明栈元素具有 线性关系,即 前驱后继 关系。只不 过它是一种特殊的线性表而已。 2:定义中说在线性表的表的表尾进行插入和删除操作,注意这里表尾指的是

WenJieya的博客 7499

STM32入门教程:无人机控制

我们将会一步一步引导您完成无人机的控制代码,包括无人机的姿态控制、飞行控制和通信控制等。第三步:配置无人机姿态控制 无人机的姿态控制是指控制无人机在空中的倾斜和转向。为了实现姿态控制,我们需要使用加速度计和陀螺仪传感器来获取无人机的姿态信息,并使用PID控制算法来控制无人机的姿态。在这一步骤中,您需要根据您使用的具体传感器和控制算法的要求进行更详细的配置和编码。在通信控制中,您需要考虑到通信的稳定性和可靠性。第五步:通信控制 无人机的通信控制是指与地面站或其他设备进行通信,传输飞行数据和接收飞行指令。

m0_75244442的博客 747

栈—数据结构

6、获取栈顶元素(获取栈顶元素,在外面开一个空间,将该空间的地址传过去,进行获取元素,以便于区分元素还是返回值)入栈的方向是是增栈的方式,放入数据的是满栈的方式。入栈的方向是是减栈的方式,放入数据的是满栈的方式。入栈的方向是是增栈的方式,放入数据的是空栈的方式。入栈的方向是是减栈的方式,放入数据的是空栈的方式。3、出栈(看一下,出去的元素,所以和6一样)1、入栈:先放入输入,再移动栈顶指针。2、出栈:先移动栈顶指针,再数据弹出。1、入栈:先挪栈顶指针,再放入数据。2、出栈:先移出数据,再移动指针。

weixin_63722559的博客 1428

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

数据结构——栈

本文介绍了栈的基本概念和两种实现方式:顺序栈和链栈。主要操作包括压栈(插入)和出栈(删除)。顺序栈采用数组实现,具有高效尾部操作的优势;链栈则使用链表结构实现。最后通过一道有效的括号匹配算法题展示了栈的实际应用。理解栈的实现原理有助于掌握更复杂的数据结构,并为算法学习打下基础。

2401_88326089的博客 1120

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

数据结构-栈及栈的应用

栈的概述 栈式一种重要的线性结构,属于一种操作受限的线性表 栈(stack) 是限定尽在表尾进行插入或删除操作的线性表 表尾端称为栈顶(top),表头端称为栈底(bottom) 栈的元素先进后出(后进先出),即最先进入栈的元素最后出栈 ...

初始化的博客 5106

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数据结构——————栈

栈(Stack)是一种特殊的线性数据结构,其插入和删除操作都只允许在表的一端进行。这一端被称为栈顶(top),另一端则被称为栈底(bottom)。栈遵循后进先出(Last In First Out,LIFO)的规则,即最后存入的元素将被最先取出。顺序栈采用一个数组存放栈中的元素。如果需要用到两个类型相同的栈,这时若为它们各自开辟一个数组空间,极有可能出现这样的情况:第一个栈已满,再进栈就溢出了,而另一个栈还有很多空闲的存储空间。解决这个问题的方法是。

m0_66847953的博客 1383

【数据结构】栈

什么是栈?栈:一种特殊的线性表其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈顶 栈底是什么,线性表又是什么?栈顶与栈底是不固定的,取决于你想在哪边操作。拿顺序表举例,若只在表尾增删,那表尾就是栈顶,相对的表头就是栈底。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈,出数据也在栈顶。因为栈一般是存储在堆上的,故栈的大小可以看作无穷大(取决于你的机器)。【数据结构】初阶——顺序表①为什么说栈是受限制的。

Kaisir777的博客 879

【数据结构】栈和队列——栈

本文介绍了栈和队列的基本概念与实现方式。主要内容包括: 栈的定义与特点:受限线性表,遵循先进后出(FILO)原则,仅允许在栈顶进行插入(push)和删除(pop)操作。 栈的存储结构:顺序栈(数组实现)和链式栈(链表实现),分析各自优缺点。 顺序栈的实现细节:包括静态和动态两种方式,重点说明栈顶指针的两种不同定义方式及其操作差异。 栈的基本操作:详细讲解入栈(Push)操作的实现逻辑,包括栈满判断、元素放置和指针更新等关键步骤。 文章通过代码示例展示了顺序栈的初始化、入栈和出栈操作,并特别强调了动态顺序栈的

m0_72516377的博客 963

栈数据结构

栈是一种先进后出的数据结构,可以分为:顺序栈和链式栈 一、顺序栈 1、其结构如下图所示: 2、栈的基本操作,只有如下的五个 push( ) 入栈 pop( ) 出栈 empty( ) 是否为空 top( ) 返回栈顶元素 size( ) 返回栈中元素个数 swap() 交换 #include<iostream> #include<stack> ...

Jeffxu_lib的博客 2449
上一篇: 括号匹配问题
踏雪却无痕
博客等级 码龄14年 0粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值