how2j.cn


工具版本兼容问题
序列分先进先出FIFO,先进后出FILO
FIFO在Java中又叫Queue 队列
FILO在Java中又叫Stack 栈


本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频



7分58秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器



示例 1 : LinkedList 与 List接口   
示例 2 : 双向链表 - Deque   
示例 3 : 队列 - Queue   
示例 4 : ArrayList 与 LinkedList的区别   
示例 5 : 练习-使用LinkedList实现Stack栈   
示例 6 : 答案-使用LinkedList实现Stack栈   

示例 1 :

LinkedList 与 List接口

edit
ArrayList一样,LinkedList也实现了List接口,诸如add,remove,contains等等方法。 详细使用,请参考 ArrayList 常用方法,在此不作赘述。

接下来要讲的是LinkedList的一些特别的地方
示例 2 :

双向链表 - Deque

edit
除了实现了List接口外,LinkedList还实现了双向链表结构Deque,可以很方便的在头尾插入删除数据

什么是链表结构: 与数组结构相比较,数组结构,就好像是电影院,每个位置都有标示,每个位置之间的间隔都是一样的。 而链表就相当于佛珠,每个珠子,只连接前一个和后一个,不用关心除此之外的其他佛珠在哪里。
双向链表 - Deque
package collection; import java.util.LinkedList; import charactor.Hero; public class TestCollection { public static void main(String[] args) { //LinkedList是一个双向链表结构的list LinkedList<Hero> ll =new LinkedList<Hero>(); //所以可以很方便的在头部和尾部插入数据 //在最后插入新的英雄 ll.addLast(new Hero("hero1")); ll.addLast(new Hero("hero2")); ll.addLast(new Hero("hero3")); System.out.println(ll); //在最前面插入新的英雄 ll.addFirst(new Hero("heroX")); System.out.println(ll); //查看最前面的英雄 System.out.println(ll.getFirst()); //查看最后面的英雄 System.out.println(ll.getLast()); //查看不会导致英雄被删除 System.out.println(ll); //取出最前面的英雄 System.out.println(ll.removeFirst()); //取出最后面的英雄 System.out.println(ll.removeLast()); //取出会导致英雄被删除 System.out.println(ll); } }
LinkedList 除了实现了List和Deque外,还实现了Queue接口(队列)。
Queue是先进先出队列 FIFO,常用方法:
offer 在最后添加元素
poll 取出第一个元素
peek 查看第一个元素
队列 - Queue
package collection; import java.util.LinkedList; import java.util.List; import java.util.Queue; import charactor.Hero; public class TestCollection { public static void main(String[] args) { //和ArrayList一样,LinkedList也实现了List接口 List ll =new LinkedList<Hero>(); //所不同的是LinkedList还实现了Deque,进而又实现了Queue这个接口 //Queue代表FIFO 先进先出的队列 Queue<Hero> q= new LinkedList<Hero>(); //加在队列的最后面 System.out.print("初始化队列:\t"); q.offer(new Hero("Hero1")); q.offer(new Hero("Hero2")); q.offer(new Hero("Hero3")); q.offer(new Hero("Hero4")); System.out.println(q); System.out.print("把第一个元素取poll()出来:\t"); //取出第一个Hero,FIFO 先进先出 Hero h = q.poll(); System.out.println(h); System.out.print("取出第一个元素之后的队列:\t"); System.out.println(q); //把第一个拿出来看一看,但是不取出来 h=q.peek(); System.out.print("查看peek()第一个元素:\t"); System.out.println(h); System.out.print("查看并不会导致第一个元素被取出来:\t"); System.out.println(q); } }
示例 4 :

ArrayList 与 LinkedList的区别

edit
ArrayList 与 LinkedList的区别是面试常常会问到的考题
具体区别,详见 ArrayList 与 LinkedList的区别
示例 5 :

练习-使用LinkedList实现Stack栈

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
FIFO(先入先出的)队列类似的一种数据结构是FILO先入后出Stack
根据接口Stack :
实现类:MyStack

public class MyStack implements Stack

并向这个栈中,压入5个英雄,接着弹出5个英雄

再解释一下栈: 栈的结构,就像给弹夹添加子弹一样,先添加的子弹,就放在了最下面,打手枪的时候,只能从最上面取子弹。
练习-使用LinkedList实现Stack栈
package collection; import charactor.Hero; public interface Stack { //把英雄推入到最后位置 public void push(Hero h); //把最后一个英雄取出来 public Hero pull(); //查看最后一个英雄 public Hero peek(); }
package collection;

import charactor.Hero;

public interface Stack {

	//把英雄推入到最后位置
	public void push(Hero h); 
	//把最后一个英雄取出来
	public Hero pull(); 
	//查看最后一个英雄
	public Hero peek();
}
示例 6 :

答案-使用LinkedList实现Stack栈

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

5分9秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器


package collection; import java.util.LinkedList; import charactor.Hero; public class MyStack implements Stack{ LinkedList<Hero> heros = new LinkedList<Hero>(); @Override public void push(Hero h) { heros.addLast(h); } @Override public Hero pull() { return heros.removeLast(); } @Override public Hero peek() { return heros.getLast(); } public static void main(String[] args) { MyStack heroStack = new MyStack(); for (int i = 0; i < 5; i++) { Hero h = new Hero("hero name " + i); System.out.println("压入 hero:" + h); heroStack.push(h); } for (int i = 0; i < 5; i++) { Hero h =heroStack.pull(); System.out.println("弹出 hero" + h); } } }


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2024-07-07 MyStack实现
虚心求学




栈,FILO,后进先出。 如果用LinkedList 来实现: 1.LinkedList是一个链表,add进来的新元素,会在链表的头部增加一个元素 In_1; 2.继续增加新元素 In_2,头部(顶部)又增加了一个元素,那么上一次加入的元素 In_1则变为了链表的尾部。 3.而栈,加入元素是push,也就是推压进一个元素到栈顶,这恰好就对应了链表的头部,也就是可以用链表的add方法来表示栈的push方法。 4.出栈时,从栈顶pull拉出一个元素,这不就恰好是从链表的头部,也就是最后加入的元素被取出来了,就可以用链表的poll方法。 总结,当 stack 加入 / push 一个元素时,使用链表的 add 方法将新元素加到链表头部/顶部,即入栈; 当 stack 取出 / pull 一个元素时,使用链表的 poll 方法,将链表头部/顶部/最后加入的元素取出来,即出栈。 演示: in后面的序号i,表示该元素是第几个加入stack中的。比如in_1是最初加入的,in_2是in_1加入后再加入的,也就是in_2是后入栈的元素。 现在开始入栈: [] [hero:in_1] [hero:in_1, hero:in_2] [hero:in_1, hero:in_2, hero:in_3] [hero:in_1, hero:in_2, hero:in_3, hero:in_4] 现在开始出栈: [hero:in_1, hero:in_2, hero:in_3, hero:in_4] [hero:in_1, hero:in_2, hero:in_3] [hero:in_1, hero:in_2] [hero:in_1] []
加载中
package j2se;
import java.util.LinkedList;

public class MyStack<E> implements Stack<E>{

	private LinkedList<E>value;
	public MyStack()
	{
		value = new LinkedList<>();
	}
	@Override
	public void push(E element) {
		value.add(element);
	}

	@Override
	public E pull() {
		return value.pollLast();
	}

	@Override
	public E peek() {
		return value.peekLast();
	}
	
	@Override
	public String toString()
	{
		return value.toString();
	}
	
	public void print()
	{
		System.out.println(this);
	}
	
}

----------------下面为mian----------------------------

public static void main(String[] args) {
		MyStack<Hero> heros = new MyStack<>();
		//入栈
		System.out.println("\r\n现在开始入栈:");
		heros.print();
		heros.push(new Hero("in_1"));
		heros.print();
		heros.push(new Hero("in_2"));
		heros.print();
		heros.push(new Hero("in_3"));
		heros.peek();//查看最后一个元素,但不取出
		heros.print();
		heros.push(new Hero("in_4"));
		heros.print();
		
		//出栈
		System.out.println("\r\n现在开始出栈:");
		heros.print();
		heros.pull();
		heros.print();
		heros.pull();
		heros.print();
		heros.pull();
		heros.print();
		heros.pull();
		heros.print();
	}

							


1 个答案

虚心求学
答案时间:2024-07-07
Stack接口比较简单



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2023-09-22 练习:实现栈
whitebird




练习
package com.white.stack;


import com.white.stack.Stack;

import java.util.LinkedList;

/**
 * @author : white
 * @date: 2023/9/22 - 09 - 22 - 22:08
 * @Description: com.white.collection
 * @version: 1.0
 */
public class MyStack<E> implements Stack<E> {
    /**
     * stack 保存LinkedList的实例对象
     * */
    private LinkedList<E> stack;
    /**
     * 返回LinkedList<>()对象给stack
     * */
    public MyStack(){
        this.stack = new LinkedList<>();
    }

    /**
     *入栈操作
     * */
    @Override
    public void push(E h) {
        stack.addLast(h);
    }

    /**
     *出栈操作
     * */
    @Override
    public E pull() {
        if(stack.isEmpty()){
            throw new IllegalStateException("栈为空");
        }
        return stack.pollLast();
    }

    /**
     *查看操作
     * */
    @Override
    public E peek() {
        if(stack.isEmpty()){
            throw new IllegalStateException("栈为空");
        }
        return stack.peekLast();
    }

    /**
     *打印stack信息
     * */
    @Override
    public String toString() {
        return "MyStack{" +
                "stack=" + stack +
                '}';
    }

    /**
     *返回stack集合,用于增强for循环的时候使用
     * */
    public  LinkedList<E> it(){
        return this.stack;
    }
}

package com.white.stack;

import com.white.collection.Hero;

import java.util.Iterator;

/**
 * @author : white
 * @date: 2023/9/22 - 09 - 22 - 22:46
 * @Description: com.white.stack
 * @version: 1.0
 */
public class Test {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        //实例化对象
        MyStack<Hero> heroStack = new MyStack<>();

        //入栈操作*5
        for (int i = 0; i < 5; i++) {
            heroStack.push(new Hero("hero "+i));
        }
        //打印栈
        System.out.println(heroStack);

        //使用自定义的it方法和增强for循环,遍历栈
        for(Hero h:heroStack.it()){
            System.out.println(h);
        }

        //遍历栈,查看元素的同时,做出栈操作
        for (int i = 0; i < 5; i++) {
            System.out.println(heroStack.peek());
            heroStack.pull();
        }
        System.out.println(heroStack);
        
    }
}


package com.white.stack;

/**
 * @author : white
 * @date: 2023/9/22 - 09 - 22 - 22:10
 * @Description: com.white.collection
 * @version: 1.0
 */
public interface Stack<E> {

    //英雄入栈
    public void push(E h);

    //英雄出栈
    public E pull();

    //查看最后一个英雄
    public E peek();


}

							


1 个答案

wr123
答案时间:2023-11-23
package collection; import java.util.LinkedList; import java.util.List; import java.util.Queue; import charactor.Hero; public class TestCollection { public static void main(String[] args) { MyStack heroes = new MyStack(); for(int i=0;i<5;i++){ heroes.push(new Hero("hero"+i)); } System.out.println(heroes.toString()); heroes.pull(); System.out.println(heroes.toString()); System.out.println(heroes.peek().toString()); } }



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2022-05-30 答案
2021-07-05 练习 - 使用LinkedList实现Stack栈
2021-04-15 实现


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 29 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 JAVA 中级-集合框架-LinkedList 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 578362961
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图