Java中的栈和队列

一、队列

提到队列大家估计最先想到的都是,“数据结构”、“先进先出”啦之类的词语,其实这很好,这两点总结了队列的绝大部分特点。

队列就是一种名为线性表的数据结构,它只允许在线性表的前端进行删除操作,在线性表的后端进行插入操作(先进先出)。

        在Java中如果我们想使用队列这种数据结构的话,我们是不需要自己定义的哦,我们可以使用LinkedList把它当成队列使用,因为它实现了Queue(队列)接口,根据Java中的多态,我们可以直接将Linked当做队列来使用。

1.队列的定义

Queue<引用类型> queue = new LinkedList<引用类型>();

注意队列的定义使用到了泛型,这让我们可以方便的创建各种类型的队列,不过“<>”(尖括号)里面必须是引用类型,或是基本数据类型的包装类。

例如: 

Queue<Integer> queue = new LinkedList<Integer>();        Integer是int的包装类

Queue<String> queue = new LinkedList<String>();

2.“入队”(添加元素)

        <1>add和offer

使用方法:

        queue.offer("a");

或者是

        queue.add("a"); 

 两者在用法上没有什么区别,不过在使用时推荐使用offer()

        <2>add和offer的区别

对于一些大小有限制的队列,如果在队满的情况下想要再往队列中添加新的元素,队列会拒绝。如果使用add()会得到一个unchecked的异常,然后程序结束,但是使用offer()会收到一个false的返回值,我们可以借由这个返回值去做判断,是不是队列满了,而不是直接导致程序结束。

3.“出队”(移除元素)

        <1>remove和poll 

使用方法:

        queue.remove();

或者是

        queue.poll(); 

 

        两者在用法和功能上没有什么区别,都是删除一个队首元素并返回该元素的值,不过在使用

        时推荐使用poll()

        <2>poll和remove的区别

两个函数的功能和用法都相同,不过在使用一个空的队列调用这两个函数时,remove()会抛出一个异常,而poll会返回一个null;

4.查询头部元素

        <1>elemen和peek 

使用方法:

        queue.element()

或者是

        queue.peek()

两者在用法和功能上没有什么区别,都是返回队首元素的值,不过在使用时推荐使用peek()

        <2>elemen和peek 的区别

和remove类似在队列为空时element会抛出异常,而peek会返回null

5.队列的遍历方式

        <1>增强for循环

        for (int num :arr){
            queue.offer(num);
        }

遍历结束后队列中的值不变 

        <2>while循环 

        while (!queue.isEmpty()){
            System.out.println(queue.poll());
        }

6.队列的其他常用方法

isEmpty()判断队列是否为空,空则返回true,反之false
size()判断队列中的元素个数

二、栈 

在数据结构中提到栈,我们最先想到的应该是先进后出或者(后进先出),所以栈类似于一个只开了一口的容器,容器中的元素(或者说瓶子里装的东西)叠在一起,每次取出的都是最上面的元素,也就是最后放进去的元素.

我们常会听到一些名词"栈顶","栈底","入栈","出栈","压栈"、“空栈”,那么这些操作都是什么意思呢?

1.名词解释

栈顶:线性表允许进行插入删除的那一端,在这张图里就是上面开口的那一端,位于栈顶的元素被称为栈顶元素,我们一般会定义top指针让它指向栈顶元素

栈底: 固定的,不允许进行插入和删除的另一端,图里就是封闭的一端

 入栈:也叫压栈(这个可能是把子弹压入弹夹的意思哈,非常的形象),就是在栈顶添加元素的动作。

出栈:就是移除栈顶元素的动作。

空栈:是指一个没装任何元素的栈。

 2.java中栈的定义

Stack<引用类型> stack = new Stack<引用类型>();

注意:和队列相同这里要用包装类

 3.入栈(压栈)

stack.push("1"); stack.push("2");

4.出栈

System.out.println(stack.pop());

返回栈顶元素,并移除

5.查看栈顶元素

System.out.println(stack.peek());

返回栈顶元素,不移除

6.其他常用函数

empty()判断栈是否为空
size()返回栈中的元素个数

search()

返回元素在栈中的位置,从1开始,若有相同元素返回第一个
int[] arr = {9,8,7,3,4,2,2,1};
Stack<Integer> stack = new Stack<>();
for (int num :arr){
            stack.push(num);
        }
 System.out.println(stack.search(2));

输出:2 

 

  • 15
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 栈和队列都是常见的数据结构,可以通过使用内置的类或自定义类来实现。 栈是一种后进先出(LIFO)的数据结构,类似于一堆盘子,只能从最上面取盘子。Java 的 Stack 类就是一个典型的栈实现,它提供了 push()、pop()、peek() 等方法。例如: ```java Stack<Integer> stack = new Stack<>(); stack.push(1); stack.push(2); stack.push(3); System.out.println(stack.pop()); // 输出 3 System.out.println(stack.peek()); // 输出 2 ``` 队列是一种先进先出(FIFO)的数据结构,类似于排队等候。Java 的 Queue 接口提供了队列的基本操作,例如 offer()、poll()、peek() 等方法。LinkedList 类实现了 Queue 接口,可以用来实现队列。例如: ```java Queue<Integer> queue = new LinkedList<>(); queue.offer(1); queue.offer(2); queue.offer(3); System.out.println(queue.poll()); // 输出 1 System.out.println(queue.peek()); // 输出 2 ``` 除了内置的类,我们也可以自定义栈和队列的实现。例如,使用数组实现栈: ```java class MyStack { private int[] arr; private int top; public MyStack(int size) { arr = new int[size]; top = -1; } public void push(int val) { if (top == arr.length - 1) { throw new RuntimeException("Stack overflow"); } arr[++top] = val; } public int pop() { if (top == -1) { throw new RuntimeException("Stack underflow"); } return arr[top--]; } public boolean isEmpty() { return top == -1; } } ``` 使用链表实现队列: ```java class MyQueue { private ListNode head; private ListNode tail; public MyQueue() { head = null; tail = null; } public void offer(int val) { ListNode node = new ListNode(val); if (tail == null) { head = node; } else { tail.next = node; } tail = node; } public int poll() { if (head == null) { throw new RuntimeException("Queue underflow"); } int val = head.val; head = head.next; if (head == null) { tail = null; } return val; } public boolean isEmpty() { return head == null; } private class ListNode { int val; ListNode next; public ListNode(int val) { this.val = val; this.next = null; } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值