Java栈实现[通俗易懂]

Java栈实现[通俗易懂]数组实现的栈一:优点:插入和删除很快,缺点:长度有限publicclassStack{ privateinttop=-1; privateObject[]objs; publicStack()throwsException{ this(10); } publicStack(intcapacity)throwsExceptio

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

栈数组实现一:优点:入栈和出栈速度快,缺点:长度有限(有时候这也不能算是个缺点)

public class Stack {
	private int top = -1;
	private Object[] objs;
	
	public Stack(int capacity) throws Exception{
		if(capacity < 0)
			throw new Exception("Illegal capacity:"+capacity);
		objs = new Object[capacity];
	}
	
	public void push(Object obj) throws Exception{
		if(top == objs.length - 1)
			throw new Exception("Stack is full!");
		objs[++top] = obj;
	}
	
	public Object pop() throws Exception{
		if(top == -1)
			throw new Exception("Stack is empty!");
		return objs[top--];
	}
	
	public void dispaly(){
		System.out.print("bottom -> top: | ");
		for(int i = 0 ; i <= top ; i++){
			System.out.print(objs[i]+" | ");
		}
		System.out.print("\n");
	}
	
	public static void main(String[] args) throws Exception{
		Stack s = new Stack(2);
		s.push(1);
		s.push(2);
		s.dispaly();
		System.out.println(s.pop());
		s.dispaly();
		s.push(99);
		s.dispaly();
		s.push(99);
	}
}
bottom -> top: | 1 | 2 | 
2
bottom -> top: | 1 | 
bottom -> top: | 1 | 99 | 
Exception in thread "main" java.lang.Exception: Stack is full!
	at Stack.push(Stack.java:17)
	at Stack.main(Stack.java:44)

数据项入栈和出栈的时间复杂度都为常数O(1)

栈数组实现二:优点:无长度限制,缺点:入栈慢

import java.util.Arrays;

public class UnboundedStack {
	private int top = -1;
	private Object[] objs;
	
	public UnboundedStack() throws Exception{
		this(10);
	}
	
	public UnboundedStack(int capacity) throws Exception{
		if(capacity < 0)
			throw new Exception("Illegal capacity:"+capacity);
		objs = new Object[capacity];
	}
	
	public void push(Object obj){
		if(top == objs.length - 1){
			this.enlarge();
		}
		objs[++top] = obj;
	}
	
	public Object pop() throws Exception{
		if(top == -1)
			throw new Exception("Stack is empty!");
		return objs[top--];
	}
	
	private void enlarge(){
		int num = objs.length/3;
		if(num == 0)
			num = 1;
		objs = Arrays.copyOf(objs, objs.length + num);
	}
	
	public void dispaly(){
		System.out.print("bottom -> top: | ");
		for(int i = 0 ; i <= top ; i++){
			System.out.print(objs[i]+" | ");
		}
		System.out.print("\n");
	}
	
	public static void main(String[] args) throws Exception{
		UnboundedStack us = new UnboundedStack(2);
		us.push(1);
		us.push(2);
		us.dispaly();
		System.out.println(us.pop());
		us.dispaly();
		us.push(99);
		us.dispaly();
		us.push(99);
		us.dispaly();
	}
}
bottom -> top: | 1 | 2 | 
2
bottom -> top: | 1 | 
bottom -> top: | 1 | 99 | 
bottom -> top: | 1 | 99 | 99 | 

由于该栈是由数组实现的,数组的长度是固定的,当栈空间不足时,必须将原数组数据复制到一个更长的数组中,考虑到入栈时或许需要进行数组复制,平均需要复制N/2个数据项,故入栈的时间复杂度为O(N),出栈的时间复杂度依然为O(1)

栈单链表实现:没有长度限制,并且出栈和入栈速度都很快

public class LinkedList {
	private class Data{
		private Object obj;
		private Data next = null;
		
		Data(Object obj){
			this.obj = obj;
		}
	}
	
	private Data first = null;
	
	public void insertFirst(Object obj){
		Data data = new Data(obj);
		data.next = first;
		first = data;
	}
	
	public Object deleteFirst() throws Exception{
		if(first == null)
			throw new Exception("empty!");
		Data temp = first;
		first = first.next;
		return temp.obj;
	}
			
	public void display(){
		if(first == null)
			System.out.println("empty");
		System.out.print("top -> bottom : | ");
		Data cur = first;
		while(cur != null){
			System.out.print(cur.obj.toString() + " | ");
			cur = cur.next;
		}
		System.out.print("\n");
	}
}
public class LinkedListStack {
	private LinkedList ll = new LinkedList();
	
	public void push(Object obj){
		ll.insertFirst(obj);
	}
	
	public Object pop() throws Exception{
		return ll.deleteFirst();
	}
	
	public void display(){
		ll.display();
	}
	
	public static void main(String[] args) throws Exception{
		LinkedListStack lls = new LinkedListStack();
		lls.push(1);
		lls.push(2);
		lls.push(3);
		lls.display();
		System.out.println(lls.pop());
		lls.display();
	}
}
top -> bottom : | 3 | 2 | 1 | 
3
top -> bottom : | 2 | 1 | 

数据项入栈和出栈的时间复杂度都为常数O(1)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196768.html原文链接:https://javaforall.net

(0)
上一篇 2025年9月20日 下午2:43
下一篇 2025年9月20日 下午3:22


相关推荐

  • 8个hybridapp开发工具_android hybrid

    8个hybridapp开发工具_android hybridHybridApp(混合模式移动应用)是指介于web-app、native-app这两者之间的app,兼具“NativeApp良好用户交互体验的优势”和“WebApp跨平台开发的优势”。    HybridApp是指介于web-app、native-app这两者之间的app,它虽然看上去是一个NativeApp,但只有一个UIWebView,里面访问的是一个Web

    2025年12月8日
    6
  • 什么软件可以测试网络的稳定性,网络稳定性测试软件

    什么软件可以测试网络的稳定性,网络稳定性测试软件@ECHOoffcolor0Aecho欢迎进行网络稳定状况测试(测试开始时间%date%%time%)echo=======================================================================echo运行脚本后不要关闭这个窗口,让它一直测试你的网络,不想测试了需手动关闭echo当你老掉线的时候运行本脚本,建议测试时间在30分钟左…

    2025年10月10日
    2
  • thinkphp5.0 文章详情页 上一篇 下一篇

    thinkphp5.0 文章详情页 上一篇 下一篇

    2021年10月14日
    58
  • 算法复杂度比较「建议收藏」

    算法复杂度比较「建议收藏」常见函数算法时间复杂度由小到大依次为:Ο(1)<Ο(loga^n)<Ο(n)<Ο(nlogn)<Ο(n2)<Ο(n3)<Ο(n!)<Ο(N^n)常见算法复杂度对比快速排序nlogn堆排序nlogn冒泡排序在改良的冒泡下最优时间复杂度为n插入排序最优下n选择排序n*n归并nlogn对N个数进行排序,在各自最优条件下以下算法复杂度最…

    2025年7月22日
    5
  • matplotlib-base_matplotlib3d柱状图

    matplotlib-base_matplotlib3d柱状图作者:Vamei出处:http://www.cnblogs.com/vamei欢迎转载,也请保留这段声明。谢谢!在数据可视化过程中,我们常常需要将数据根据其采集的地理位置在地图上显示出来。比如说我

    2022年8月2日
    8
  • java一种集合_java创建集合

    java一种集合_java创建集合深入浅出学Java——HashMap哈希表(hashtable)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,本文会对java集合框架中的对应实现HashMap的实现原理进行讲解,然后会对JDK7的HashMap源码进行分析。一、什么是哈希表在讨论哈希表之前,我们先大概了解下其他数据结构在新增,…

    2025年10月23日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号