栈的java实现和栈的应用举例(华为面试)

华为OD的五轮面试总结 华为OD的五轮面试 简述 在今年疫情期间,通过BOSS直聘,受邀华为OD的Java工程师面试;整整一个月(3月中-4月初)的时间,经过了5轮的筛选,现在对这次面试进行概括性复盘,给大家分享下我所收集到的各种信息和相关面试流程的建议,希望对大家有用; 华为OD是什么?跟华为又有什么关系? 根据各方信息所得(包括网络查询、面试官的解答),华为OD是华为与德科的合作的一个针对华为社招人才培养的一种新型方式;开始时间大概是2019年试行,2020普遍应用的一种社招方式;(讲些人话)大概的意思就是,华为从2019年 阅读详情


转载自coolxing


[例子和习题出自数据结构(严蔚敏版), 本人使用java进行实现.  转载请注明作者和出处,  如有谬误, 欢迎在评论中指正. ]

栈的实现

栈是一种先进后出的数据结构, 首先定义了栈需要实现的接口:

public interface MyStack<T> {
	/**
	 * 判断栈是否为空
	 */
	boolean isEmpty();
	/**
	 * 清空栈
	 */
	void clear();
	/**
	 * 栈的长度
	 */
	int length();
	/**
	 * 数据入栈
	 */
	boolean push(T data);
	/**
	 * 数据出栈
	 */
	T pop();
}

栈的数组实现, 底层使用数组:
public class MyArrayStack<T> implements MyStack<T> {
	private Object[] objs = new Object[16];
	private int size = 0;

	@Override
	public boolean isEmpty() {
		return size == 0;
	}

	@Override
	public void clear() {
		// 将数组中的数据置为null, 方便GC进行回收
		for (int i = 0; i < size; i++) {
			objs[size] = null;
		}
		size = 0;
	}

	@Override
	public int length() {
		return size;
	}

	@Override
	public boolean push(T data) {
		// 判断是否需要进行数组扩容
		if (size >= objs.length) {
			resize();
		}
		objs[size++] = data;
		return true;
	}

	/**
	 * 数组扩容
	 */
	private void resize() {
		Object[] temp = new Object[objs.length * 3 / 2 + 1];
		for (int i = 0; i < size; i++) {
			temp[i] = objs[i];
			objs[i] = null;
		}
		objs = temp;
	}

	@SuppressWarnings("unchecked")
	@Override
	public T pop() {
		if (size == 0) {
			return null;
		}
		return (T) objs[--size];
	}

	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append("MyArrayStack: [");
		for (int i = 0; i < size; i++) {
			sb.append(objs[i].toString());
			if (i != size - 1) {
				sb.append(", ");
			}
		}
		sb.append("]");
		return sb.toString();
	}
}  

栈的链表实现, 底层使用链表:
public class MyLinkedStack<T> implements MyStack<T> {
	/**
	 * 栈顶指针
	 */
	private Node top;
	/**
	 * 栈的长度
	 */
	private int size;
	
	public MyLinkedStack() {
		top = null;
		size = 0;
	}
	
	@Override
	public boolean isEmpty() {
		return size == 0;
	}
	
	@Override
	public void clear() {
		top = null;
		size = 0;
	}
	
	@Override
	public int length() {
		return size;
	}
	
	@Override
	public boolean push(T data) {
		Node node = new Node();
		node.data = data;
		node.pre = top;
		// 改变栈顶指针
		top = node;
		size++;
		return true;
	}
	
	@Override
	public T pop() {
		if (top != null) {
			Node node = top;
			// 改变栈顶指针
			top = top.pre;
			size--;
			return node.data;
		}
		return null;
	}
	
	/**
	 * 将数据封装成结点
	 */
	private final class Node {
		private Node pre;
		private T data;
	}
}

两种实现的比较, 主要比较数据入栈和出栈的速度:
@Test
public void testSpeed() {
	MyStack<Person> stack = new MyArrayStack<Person>();
	int num = 10000000;
	long start = System.currentTimeMillis();
	for (int i = 0; i < num; i++) {
		stack.push(new Person("xing", 25));
	}
	long temp = System.currentTimeMillis();
	System.out.println("push time: " + (temp - start));
	while (stack.pop() != null)
		;
	System.out.println("pop time: " + (System.currentTimeMillis() - temp));
}

MyArrayStack中入栈和出栈10,000,000条数据的时间:

push time: 936
pop time: 47

将MyArrayStack改为MyLinkedStack后入栈和出栈的时间:

push time: 936

pop time: 126

可见两者的入栈速度差不多, 出栈速度MyArrayStack则有明显的优势.

为什么测试结果是这样的? 可能有些朋友的想法是数组实现的栈应该具有更快的遍历速度, 但增删速度应该比不上链表实现的栈才对. 但是栈中数据的增删具有特殊性: 只在栈顶入栈和出栈. 也就是说数组实现的栈在增加和删除元素时并不需要移动大量的元素, 只是在数组扩容时需要进行复制. 而链表实现的栈入栈和出栈时都需要将数据包装成Node或者从Node中取出数据, 还需要维护栈顶指针和前驱指针. 


栈的应用举例

1. 将10进制正整数num转换为n进制

private String conversion(int num, int n) {
	MyStack<Integer> myStack = new MyArrayStack<Integer>();
	Integer result = num;
	while (true) {
		// 将余数入栈
		myStack.push(result % n);
		result = result / n;
		if (result == 0) {
			break;
		}
	}
	StringBuilder sb = new StringBuilder();
	// 按出栈的顺序倒序排列即可
	while ((result = myStack.pop()) != null) {
		sb.append(result);
	}
	return sb.toString();
}

2. 检验符号是否匹配. '['和']', '('和')'成对出现时字符串合法. 例如"[][]()", "[[([]([])()[])]]"是合法的; "([(])", "[())"是不合法的.

遍历字符串的每一个char, 将char与栈顶元素比较. 如果char和栈顶元素配对, 则char不入栈, 否则将char入栈. 当遍历完成时栈为空说明字符串是合法的.

public boolean isMatch(String str) {
	MyStack<Character> myStack = new MyArrayStack<Character>();
	char[] arr = str.toCharArray();
	for (char c : arr) {
		Character temp = myStack.pop();
		// 栈为空时只将c入栈
		if (temp == null) {
			myStack.push(c);
		}
		// 配对时c不入栈
		else if (temp == '[' && c == ']') {
		} 
		// 配对时c不入栈
		else if (temp == '(' && c == ')') {
		} 
		// 不配对时c入栈
		else {
			myStack.push(temp);
			myStack.push(c);
		}
	}
	return myStack.isEmpty();
}

3. 行编辑: 输入行中字符'#'表示退格, '@'表示之前的输入全都无效.

使用栈保存输入的字符, 如果遇到'#'就将栈顶出栈, 如果遇到@就清空栈. 输入完成时将栈中所有字符出栈后反转就是输入的结果:

private String lineEdit(String input) {
	MyStack<Character> myStack = new MyArrayStack<Character>();
	char[] arr = input.toCharArray();
	for (char c : arr) {
		if (c == '#') {
			myStack.pop();
		} else if (c == '@') {
			myStack.clear();
		} else {
			myStack.push(c);
		}
	}
	
	StringBuilder sb = new StringBuilder();
	Character temp = null;
	while ((temp = myStack.pop()) != null) {
		sb.append(temp);
	}
	// 反转字符串
	sb.reverse();
	return sb.toString();
}



华为Java社招面试经历详解【已拿到offer】 这篇文章主要介绍了华为Java社招面试经历,详细记录了华为java面试的流程、相关面试题与参考答案,需要的朋友可以参考下。 看看自己能答对多少,如果能回答70%的题目,就大胆去阿里以及各互联网公司试试身手吧。本篇建议大家收藏、备用~ 华为Java社招面试(已拿到offer) 之前月底华为cloudsop部门打电话叫我要不要面试,当时正处于换工作的期间,于是就把简历发给华为hr,人事审核后经过一些列面试、机试,最终顺利拿到了offer,出于未来职业规划的考量,本人手里还有其他的一些offer,还没有定下来,顺 阅读详情

相关推荐

华为初面+综合面试(Java技术面)附上面试题

华为面试整体流程大致分为笔试,性格测试,面试,综合面试,回学校等结果。笔试来说,华为的难度较中等,选择题难度和网易腾讯差不多。最后的代码题,相比下来就简单很多,一共3道题目,前2题很容易就AC,题目已经记不太清楚,不过难度确实不大。最后一题最后提交的代码过了75%的样例,一直没有发现剩下的25%可能存在什么坑。 笔试部分太久远,我就不怎么回忆了。直接将面试。 面试 如果说腾讯的面试是挥金如土...

javajavajava 3万+

Java数据结构 | 栈及其应用

栈及相关应用详解

m0_56361048的博客 2389

华为OD两轮技术面试

华为OD两轮技术面试 1.两道编程题 2.面试问题 2.1 说一下常见的工厂模式 2.2出现full gc定位问题的步骤 2.3mysql数据库优化 2.4zookeeper的选举机制

candgbb的博客 7万+

Java中的栈(Stack)及其应用场景

栈(Stack)是一种遵循后进先出(Last-In-First-Out, LIFO)原则的线性数据结构。其核心操作包括:push():元素入栈pop():栈顶元素出栈peek():查看栈顶元素不移除isEmpty():判断栈是否为空栈的空间复杂度为O(n),基本操作的时间复杂度均为O(1),这种高效特性使其成为算法设计中重要的工具。栈作为基础数据结构,在算法设计、系统底层、编译器实现等领域有广泛应用。理解其LIFO特性及Java实现方式,能够帮助开发者更高效地解决特定类型问题。

weixin_43063624的博客 2105

华为初面+综合面试(Java技术面

这一块内容完成之后,感觉综合面试整个流程已经基本结束了,面试官开始跟我介绍他们项目组的工作地点(深圳),工作内容,以及平常的一些工作,同时还给我介绍了一些将来工作中需要了解的基本知识——比如docker容器,k8s,部分国内国外的公有云的运行原理,让我回去之后提前自学一下。既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

2401_83916241的博客 2742

华为数字化IT应用工程师面试经历

笔试 2021.3.18 刚刚做完了华为的机试题,一共三道编程题,可以使用本地IDE(那不果断jupyter),题目如下 我后来在牛客网上看到一哥们跟我的题一模一样,链接https://www.nowcoder.com/discuss/617066?type=all&order=time&pos=&page=1&channel=-1&source_id=search_all_nctrack 我最后成绩是0.3,AC,0.2,代码写的菜,我就不放我的代

顺子的博客 9961

Java栈的应用

Java中的栈(Stack)是一种后进先出(LIFO, Last In First Out)的数据结构。Java提供了类,该类能够在程序中实现栈的功能。Stack。

2301_81543552的博客 968

2022 最新华为面经分享:Java 高分面试指南

大厂面试真题向来都是各大求职者的最佳练兵场,而今天小编带来的便是“HUAWEI”面经!这是一次真实的面试经历,虽然不是我自己亲身经历但是听当事人叙述后便会深有同感(因为我朋友差点就与offer擦肩而过了,总共4面技术5面HR,真的好艰难)。为此,我也将这面经整理出来分享给每位程序员朋友做一个参考,可知“HUAWEI”在Java开发工程师招聘中有哪些技术性考察和倾向!...

l688899886的博客 2203

Java数据结构-栈

栈

Vampire的博客 5641

华为od面试记录

华为od面试记录

1073960086的博客 1万+

华为Cloud BU内推面试总结(已拿到offer)

华为Cloud BU内推面试总结 很幸运,这次春招内推面了三家公司,腾讯IEG,华为Cloud BU,蚂蚁金服-支付宝,全都拿到了offer。这三篇博客是按照offer的时间顺序连着的,有兴趣的话可以看我其他两篇博客。 华为的一面和二面都是现场面,在我们学校的教室。两次面试是连在一起的,没有HR面。 技术一面 由于时间太久远,记不太清具体的问题。这里只说面试问题的大概。 所有的问题包含以下几点: ...

qq_35170267的博客 3万+

深入理解Java中的栈(超详细)新手必看

栈(Stack)是一种常见的数据结构,具有后进先出(LIFO,Last In First Out)的特性,即最后入栈的元素最先出栈。栈通常用于存储临时性的数据,如方法调用过程中的局部变量、操作数栈等。在计算机科学中,栈的应用非常广泛,包括编程语言中的函数调用、内存分配以及表达式求值等领域。在Java编程语言中,栈也被广泛应用于方法调用和内存管理的过程中。双端栈(Double Ended Stack),也被称为双端队列(Deque),是一种支持在两端进行插入和删除操作的数据结构。

2201_75437633的博客 2万+

2025华为OD面试手撕代码真题目录及面试八股文

本专栏更新每年华为OD机试的高频手撕代码题,每个题目都会使用五种语言进行解答(C & C++& Java & Python & JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2024e卷,od机试,2024E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2024华为od,如何备

KJ.JK 5万+

上海华为OD--JAVA面试总结

我是2021年6月21日收到华为OD的机试邀请,华为OD机试第一次做很难,我在2019年的时候第一次接触这个机试,三道题一题不会,要想通过,前期不去LeetCode上刷题那是不可能的,好在这次面试有个华为的人事全程对接,可能是od那边真的很缺人,他们急迫想招人进去,然后给了一份常考机试题的答案给我了,一百多道,我大概花了5天时间,全部敲了一遍,机考链接给下来,有7天有效期,如果准备准备不充分的千万不要尝试去做,没过有6个月的封禁期,实在是得不偿失。想去OD的同学下面这个链接的机试题务必请务必掌握都是高频考题

文飞的博客 1万+

【华为OD技术面试手撕真题】- Java手撕技术面试八股文(4)

华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,如何备战华为od,华为od算法,华为od手撕代码,华为OD机试2025年最新题库,一文带你读懂华为OD,华为机试e卷

KJ.JK 3336

java 栈的实现和应用

用java写的简单栈的实现,欢迎大家使用

上一篇: Java内联函数(华为面试)-java可能比c++更快
下一篇: MySQL索引背后的数据结构及算法原理--优化
随风而醒
博客等级 码龄11年 96粉丝 217原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值