栈和队列-Java

这篇具有很好参考价值的文章主要介绍了栈和队列-Java。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、栈

     1.1 概念

     1.2 栈的使用

     1.3 栈的模拟实现 

     1.4 栈的应用场景

    1.5 概念区分

二、队列

    2.1 概念

    2.2 队列的使用

    2.3 队列的模拟实现

    2.4 循环队列

三、双端队列

四、面试题


一、栈

     1.1 概念

        栈:一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底,栈中的元素遵循先进后出的原则。

        压栈:栈的插入操作,也叫进栈或入栈,在栈顶插入数据出栈:栈的删除操作,在栈顶删除数据

        栈和队列-Java,初阶数据结构-Java,面试,职场和发展,java,数据结构,算法

     1.2 栈的使用

方法 解释
Stack() 构造一个空的栈
E push(E e) 将 e 入栈,并返回e
E pop() 将栈顶元素出栈并返回
E peek() 获取栈顶元素
int size() 获取栈中有效元素个数
boolean empty() 检测栈是否为空
public static void main(String[] args) {
    Stack<Integer> stack = new Stack();
    stack.push(1);
    stack.push(2);
    stack.push(3);
    stack.push(4);
    stack.push(5);

    System.out.println(stack.size());//5
    //获取栈顶元素
    System.out.println(stack.peek());//5
    System.out.println(stack);  //[1, 2, 3, 4, 5]

    stack.pop();//出栈  5

    System.out.println(stack.size());//4
    System.out.println(stack);  //[1, 2, 3, 4]

    System.out.println(stack.empty());//false
}

     1.3 栈的模拟实现 

栈和队列-Java,初阶数据结构-Java,面试,职场和发展,java,数据结构,算法

        由图可知Stack继承了VectorVectorArrayList类似,都是动态的顺序表,不同的是Vector是线程安全的。

public class MyStack {
    int[] elem;
    int usedSize;
    public MyStack(){
        elem = new int[3];
    }
    //判断栈是否满了
    private boolean CapacityIsFull(){
        return  usedSize == elem.length;
    }
    //确保容量充足
    private  void  ensureCapacity(){
        if(CapacityIsFull()){
            elem = Arrays.copyOf(elem,elem.length*2);
        }
    }
    //入栈
    public int push(int data){
        ensureCapacity();
        elem[usedSize++] = data;
        return  data;
    }
    //获取栈顶元素
    public int peek(){
        if(usedSize == 0){
            throw new StackNullEception("栈为空,无法获取栈顶元素");
        }
        return  elem[usedSize-1];
    }

    //出栈
    public int pop (){
        int e = peek();
        usedSize--;
        return  e;
    }
    //获取栈的长度
    public  int size(){
        return  usedSize;
    }
    //判断栈是否为空
    public boolean empty(){
        return  usedSize == 0;
    }
}

     1.4 栈的应用场景

        1. 改变元素的序列

1. 若进栈序列为 1,2,3,4 ,进栈过程中可以出栈,则下列不可能的一个出栈序列是()
        A: 1,4,3,2      B: 2,3,4,1      C: 3,1,4,2      D: 3,4,2,1
2. 一个栈的初始状态为空。现将元素 1 2 3 4 5 A B C D E 依次入栈,然后再依次出栈,则元素出栈的顺
序是( )。
A: 12345ABCDE      B: EDCBA54321      C: ABCDE12345      D: 54321EDCBA
        2. 将递归转化为循环
//递归方式
void printList(Node head){
    if(head == null){
        return;
    }
    printList(head.next);
    System.out.println(head.val+" ");
}
//循环方式
void printList2(Node head){
    if(head == null){
        return;
    }
    Stack<LinkList.Node> stack = new Stack<>();
    //将链表中的元素(节点)放入栈中
    Node cur = head;
    while(cur !=null){
        stack.push(cur);
        cur = cur.next;
    }
    //栈中的元素出栈
    while (!stack.empty()){
        System.out.print(stack.pop().val+" ");
    }
}

     3. 括号匹配

栈和队列-Java,初阶数据结构-Java,面试,职场和发展,java,数据结构,算法

        代码实现

public boolean isValid(String s) {

        Stack<Character>  stack = new Stack<>();

        for(int i = 0; i< s.length(); i++){

            char ch = s.charAt(i);

            if(ch == '(' || ch == '[' || ch == '{'){

                stack.push(ch);

            } else {

                if(stack.empty()){

                    return false;

                }

                //从栈中取栈顶

                char ch1 = stack.pop();

                if((ch1 =='(' && ch == ')') || (ch1 == '[' && ch == ']') || (ch1 == '{' && ch == '}')){

                    continue;

                } else {

                    return false;

                }

            }

        }

        //栈中还有左括号

        if(!stack.empty()){

            return false;

        }

        return true;

    }

     4. 逆波兰表达式求值

栈和队列-Java,初阶数据结构-Java,面试,职场和发展,java,数据结构,算法

    代码实现

public int evalRPN(String[] tokens) {

        Stack<Integer> stack = new Stack();

        for(String s:tokens){

            if(!(s.equals("+")||s.equals("-")||s.equals("*")||s.equals("/"))){

                stack.push(Integer.parseInt(s));

            }else{

                int num2 = stack.pop();

                int num1 = stack.pop();

                switch(s){

                    case "+":

                        stack.push(num1+num2);

                        break;

                    case "-":

                        stack.push(num1-num2);

                        break;

                    case "*":

                        stack.push(num1*num2);

                        break;

                    case "/":

                        stack.push(num1/num2);

                        break;

                }

            }

        }

        return stack.pop();

    }

     5. 出栈入栈次序匹配

栈和队列-Java,初阶数据结构-Java,面试,职场和发展,java,数据结构,算法

栈和队列-Java,初阶数据结构-Java,面试,职场和发展,java,数据结构,算法

        代码实现

public boolean IsPopOrder (int[] pushV, int[] popV) {

        Stack<Integer> stack = new Stack<>();

        //i遍历pushV,j遍历popV

        int i = 0, j = 0;

        for(;i < pushV.length; i++){

            //入栈

            stack.push(pushV[i]);

            //获取栈顶元素

            int pe = stack.peek();

            //判断栈顶元素是否需要出栈

            while(pe == popV[j]){

                stack.pop();

                j++;

                //栈空

                if(stack.empty()){

                    break;

                }

                //判断后面是否需要出栈

                pe = stack.peek();

            }

        }

        //栈中还有元素

        if(!stack.empty()){

            return false;

        }

        return true;

    }

     6. 最小栈

栈和队列-Java,初阶数据结构-Java,面试,职场和发展,java,数据结构,算法

        代码实现

class MinStack {

    //普通栈

    private Stack<Integer> stack;

    //最小值栈-》存放当前普通栈中的最小值

    private Stack<Integer> minStack;

    public MinStack() {

        stack = new Stack<>();

        minStack = new Stack<>();

    }

    //入栈

    public void push(int val) {

        if(stack.empty()){

            stack.push(val);

            minStack.push(val);

        }else {

            stack.push(val);

            int peek = minStack.peek();

            //判断minStack是否要入栈

            if(val <= peek){

                minStack.push(val);

            }

        }

    }

    //出栈

    public void pop() {

        //普通栈为空

        if(stack.empty()){

            return;

        }

        int po= stack.pop();

        //判断minStack是否要出栈

        if(po == minStack.peek()){

            minStack.pop();

        }

    }

    //获取栈顶元素

    public int top() {

        //普通栈为空

        if(stack.empty()){

            return  -1;

        }

        return stack.peek();

    }

    //获取当前栈中最小值

    public int getMin() {

        //最小值栈-》 空

        if(minStack.empty()){

            return  -1;

        }

        return minStack.peek();

    }

}文章来源地址https://www.toymoban.com/news/detail-722671.html

    1.5 概念区分

        栈、虚拟机栈、栈帧有何区别?

        栈是一种数据结构,虚拟机栈是JVM划分的一块内存,栈帧是方法调用时,虚拟机给方法分配的一块内存。

二、队列

    2.1 概念

        队列只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特点入队列:进行插入操作的一端称为队尾(Tail/Rear出队列:进行删除操作的一端称为队头

栈和队列-Java,初阶数据结构-Java,面试,职场和发展,java,数据结构,算法

    2.2 队列的使用

        Queue是个接口,底层是通过链表实现。

        栈和队列-Java,初阶数据结构-Java,面试,职场和发展,java,数据结构,算法

        

方法 解释
boolean offer(E e) 入队列
E poll() 出队列并返回
E peek() 获取队头元素
int size() 获取队列中有效长度的个数
boolean isEmpty 判断队列是否为空

        Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。

public static void main(String[] args) {
    Queue<Integer> queue = new LinkedList<>();
    //入队
    queue.offer(1);
    queue.offer(2);
    queue.offer(3);
    System.out.println(queue);//[1, 2, 3]
    //获取队头元素
    int t = queue.peek();
    System.out.println(t);//1
    //出队
    System.out.println(queue.poll());//1
    System.out.println(queue);//[2, 3]
    //判断队列是否为空
    boolean bool = queue.isEmpty();
    System.out.println(bool);//false
}

     2.3 队列的模拟实现

        队列中可以存储元素,那底层肯定要有能够保存元素的空间,通过前面线性表的学习了解到
常见的空间类型有两种:顺序结构 和 链式结构,那么 队列的实现使用顺序结构还是链式结构好?
栈和队列-Java,初阶数据结构-Java,面试,职场和发展,java,数据结构,算法
/*双向链式队列*/
public class MyLinkqueue {
    static  class  ListNode{
        int val;
        ListNode next;
        ListNode pre;
        public ListNode(int val){
            this.val = val;
        }
    }
    ListNode first;//队头
    ListNode last;//队尾
    int usedsize;//队列中元素个数
    //入队列
    public boolean offer(int data){
        ListNode node = new ListNode(data);
        if(first == null){
            //空队列
            first = node;
            last = node;
        }else {
            last.next = node;
            node.pre = last;
            last = last.next;
        }
        usedsize++;
        return  true;
    }
    //获取队头元素
    public int peek(){
        if(usedsize == 0){
            return -1;
        }
        return first.val;
    }
    //出队列
    public int poll(){
        int x = peek();
        //只有一个元素
        if(first.next==null){
            first = null;
            last = null;
        }
        first = first.next;
        first.pre = null;
        usedsize--;
        return  x;
    }
    //获取队列中元素的个数
    public int size(){
        return usedsize;
    }
    //判断队列是否为空
    public boolean isEmpty(){
        return usedsize == 0;
    }
}

     2.4 循环队列

        实际中我们有时会使用一种队列叫循环队列,环形队列通常使用数组实现。
         栈和队列-Java,初阶数据结构-Java,面试,职场和发展,java,数据结构,算法
栈和队列-Java,初阶数据结构-Java,面试,职场和发展,java,数据结构,算法
         设计循环队列

三、双端队列

        双端队列(deque)指允许两端都可以进行入队和出队操作的队列说明元素可以从队头入队和出队,也可以从队尾入队和出队。

栈和队列-Java,初阶数据结构-Java,面试,职场和发展,java,数据结构,算法

        Deque是一个接口,使用时必须创建LinkedList的对象。

        栈和队列-Java,初阶数据结构-Java,面试,职场和发展,java,数据结构,算法

        实际工程中,使用Deque接口是比较多的,栈和队列均可以使用该接口。

Deque<Integer> stack = new ArrayDeque<>();// 双端队列的线性实现
Deque<Integer> queue = new LinkedList<>();//双端队列的链式实现

四、面试题

        1、用队列实现栈    链接

栈和队列-Java,初阶数据结构-Java,面试,职场和发展,java,数据结构,算法

        代码实现

class MyStack {

    private Queue<Integer> queue1 ;

    private Queue<Integer> queue2 ;

    public MyStack() {

        queue1 = new LinkedList<>();

        queue2 = new LinkedList<>();

    }

    //入栈

    public void push(int x) {

        //栈为空

        if (empty()){

            queue1.offer(x);

        }else {

            //放入非空队列中

            if(!queue1.isEmpty()){

                queue1.offer(x);

            }else {

                queue2.offer(x);

            }

        }

    }

    //出栈

    public int pop() {

        //栈空

        if(empty()){

            return -1;

        }

        if(!queue1.isEmpty()){

            //将queue1中的size-1个元素放入queue2

            while (queue1.size()>1){

                int x= queue1.poll();

                queue2.offer(x);

            }

            //出队x并返回x

            int x = queue1.poll();

            return  x;

        }else {

            //将queue2中的size-1个元素放入queue1

            while (queue2.size()>1){

                int x= queue2.poll();

                queue1.offer(x);

            }

            //出队x并返回x

            int x = queue2.poll();

            return  x;

        }

    }

    //获取栈顶元素

    public int top() {

        //栈空

        if(empty()){

            return  -1;

        }

        if(!queue1.isEmpty()){

            //将queue1中的size-1个元素放入queue2

            while (queue1.size()>1){

                int x= queue1.poll();

                queue2.offer(x);

            }

            //出队x放入另一队列并返回x

            int x = queue1.poll();

            queue2.offer(x);

            return  x;

        }else {

            //将queue2中的size-1个元素放入queue1

            while (queue2.size()>1){

                int x= queue2.poll();

                queue1.offer(x);

            }

            //出队x放入另一队列并返回x

            int x = queue2.poll();

            queue1.offer(x);

            return  x;

        }

    }

    //判断栈是否为空

    public boolean empty() {

        //两个队都为空-》栈为空

        return queue1.isEmpty() && queue2.isEmpty();

    }

}

         2、 用栈实现队列    链接

栈和队列-Java,初阶数据结构-Java,面试,职场和发展,java,数据结构,算法

栈和队列-Java,初阶数据结构-Java,面试,职场和发展,java,数据结构,算法

        代码实现

class MyQueue {

    private Stack<Integer> stack1;//入队

    private Stack<Integer> stack2;//出队

    public MyQueue() {

        stack1 = new Stack<>();

        sstack2 = new Stack<>();

    }

    //入队

    public void push(int x) {

        stack1.push(x);

    }

    //出队

    public int pop() {

        //队空

        if(empty()){

            return -1;

        }

        //保证stack2不为空

        if(stack2.isEmpty()){

            while (!stack1.isEmpty()){

                stack2.push(stack1.pop());

            }

        }

        return stack2.pop();

    }

    //获取队头元素

    public int peek() {

        //队空

        if(empty()){

            return -1;

        }

        //保证stack2不为空

        if(stack2.isEmpty()){

            while (!stack1.isEmpty()){

                stack2.push(stack1.pop());

            }

        }

        return stack2.peek();

    }

    //判断队列是否为空

    public boolean empty() {

        //两个栈都为空-》队列为空

        return stack1.isEmpty() && stack2.isEmpty();

    }

}

到了这里,关于栈和队列-Java的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】栈和队列(队列篇)

    上期我们已经学习了数据结构中的栈,这期我们开始学习队列。 目录 1.队列的概念及结构 2.队列的实现 队列结构体定义 常用接口函数 初始化队列 队尾入队列 队头出队列 获取队列头部元素、 获取队列队尾元素 获取队列中有效元素个数 检测队列是否为空 销毁队列 3.循环队

    2024年02月13日
    浏览(42)
  • 数据结构---栈和队列

    栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作,进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:栈的删除操作

    2024年01月18日
    浏览(42)
  • 数据结构--栈和队列

    栈是一种常见的数据结构,它遵循 后进先出LIFO (Last In First Out)的原则。 进行数据插入和操作的一端称为栈顶,另一端称为栈底 。 压栈 :栈的插入操作被称为压栈/进栈/入栈,入数据在栈顶。 出栈 :栈的删除操作。出数据也在栈顶; 栈可以用 数组 或者是 链表 来实现;

    2024年02月09日
    浏览(42)
  • 数据结构 | 栈和队列

    … 📘📖📃本文已收录至:数据结构 | C语言 更多知识尽在此专栏中! 栈(Stack) 又名堆栈,它是一种运算受限的线性表,限定仅在表尾进行插入和删除操作的线性表。 队列(Queue) 也是一种特殊的线性表,特殊之处在于它只允许在表的前端(Front)进行删除操作,而在表的

    2024年01月23日
    浏览(44)
  • 数据结构——栈和队列

    目录  一.前言 二.前文回顾 三.栈 3.1 栈的概念及结构 3.2 栈的实现 3.2.1 初始化函数 3.2.2 销毁函数 3.2.3 入栈函数 3.2.4 出栈函数 3.2.5 计算大小函数 3.2.6 空栈函数 3.2.7 获取栈顶函数  3.2.8 小测试 3.3 全部代码 四.栈的练习 4.1 有效的括号 五.队列 5.1队列的概念及结构 5.2 队列的实

    2024年01月25日
    浏览(48)
  • [数据结构】栈和队列

    目录 1.栈 1.1概念 1.2 栈的使用 1.3.栈的模拟实现 2.队列 2.1概念 2.2队列的使用 2.3队列的模拟实现 2.4 循环队列 2.5双端队列   栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素

    2024年02月07日
    浏览(43)
  • 数据结构:栈和队列

    朋友们、伙计们,我们又见面了,本期来给大家解读一下栈和队列方面的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数据结构专栏:数据结构 个 人 主 页 :  stackY、 目录 前言:  1.栈 1.1栈的

    2024年02月06日
    浏览(44)
  • 栈和队列【数据结构】

    2024年02月16日
    浏览(46)
  • 数据结构【栈和队列】

    一、栈 1.定义:只允许一端进行插入和删除的线性表,结构与手枪的弹夹差不多,可以作为实现递归函数(调用和返回都是后进先出)调用的一种数据结构; 栈顶:允许插入删除的那端; 栈底:固定的,不允许插入或删除; 空栈:不含元素; 2.特点:后进先出; 3.操作:入

    2024年02月15日
    浏览(51)
  • 【数据结构】栈和队列(链表模拟队列)

      学习本章节必须具备 单链表的前置知识, 建议提前学习:点击链接学习:单链表各种功能函数 细节 详解 本章节是学习用 单链表模拟队列 1. 单链表实现队列 思路如下 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先 进先出

    2024年04月27日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包