Java中的Stack与Queue
创始人
2024-05-26 14:20:10
0

文章目录

  • 一、栈的概念及使用
    • 1.1 概念
    • 1.2 栈的使用
    • 1.3 栈的模拟实现
  • 二、队列的概念及使用
    • 2.1 概念
    • 2.2 队列的使用
    • 2.3 双端队列(Deque)
  • 三、相关OJ题
    • 3.1 用队列实现栈。
    • 3.2 用栈实现队列。
  • 总结

一、栈的概念及使用

1.1 概念

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

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶

出栈:栈的删除操作叫做出栈,出数据在栈顶

1.2 栈的使用

方法功能
Stack()构造一个空的栈
E push(E e)将e入栈,并返回e
E pop()将栈顶元素出栈并返回
E peek()获取栈顶元素
int size()获取栈中有效元素个数
boolean empty()检测栈是否为空
public static void main(String[] args) {Stack s = new Stack();s.push(1);s.push(2);s.push(3);s.push(4);System.out.println(s.size()); // 获取栈中有效元素个数---> 4System.out.println(s.peek()); // 获取栈顶元素---> 4s.pop(); // 4出栈,栈中剩余1 2 3,栈顶元素为3System.out.println(s.pop()); // 3出栈,栈中剩余1 2 栈顶元素为3if(s.empty()){System.out.println("栈空");}else{System.out.println(s.size());}
}

1.3 栈的模拟实现

在这里插入图片描述
从上图中可以看到,Stack继承了Vector,Vector和ArrayList类似,都是动态的顺序表,不同的是Vector是线程安全的。

public class MyStack {int[] array;int size;public MyStack(){array = new int[3];}public int push(int e){ensureCapacity();array[size++] = e;return e;}public int pop(){int e = peek();size--;return e;}public int peek(){if(empty()){throw new RuntimeException("栈为空,无法获取栈顶元素");}return array[size-1];}public int size(){return size;}public boolean empty(){return 0 == size;}private void ensureCapacity(){if(size == array.length){array = Arrays.copyOf(array, size*2);}}
}

二、队列的概念及使用

2.1 概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特点。

入队列:进行插入操作的一端称为队尾

出队列:进行删除操作的一端称为队头

2.2 队列的使用

在java中,Queue是个接口,底层是通过链表实现的。
在这里插入图片描述

方法功能
boolean offer(E e)入队列
E pool()出队列
peek()获取队头元素
int size()获取队列中有效元素个数
boolean isEmpty()检测元素是否为空

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

public static void main(String[] args) {Queue q = new LinkedList<>();q.offer(1);q.offer(2);q.offer(3);q.offer(4);q.offer(5); // 从队尾入队列System.out.println(q.size());System.out.println(q.peek()); // 获取队头元素q.poll();System.out.println(q.poll()); // 从队头出队列,并将删除的元素返回if(q.isEmpty()){System.out.println("队列空");}else{System.out.println(q.size());}
}

2.3 双端队列(Deque)

双端队列(deque)是指允许两端都可以进行入队和出队操作的队列,deque是"double ended queue"的简称。那就说明元素可以从队头出队和入队,也可以从队尾出队和入队。

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

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

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

三、相关OJ题

3.1 用队列实现栈。

OJ链接

代码如下:

class MyStack {private Queue qu1;private Queue qu2;public MyStack() {qu1 = new LinkedList<>();qu2 = new LinkedList<>();}public void push(int x) {if(!qu1.isEmpty()) {qu1.offer(x);}else if (!qu2.isEmpty()) {qu2.offer(x);}else  {qu1.offer(x);}}public int pop() {if(empty()) {return -1;}if(!qu1.isEmpty()) {int size = qu1.size();for (int i = 0; i < size-1; i++) {int val = qu1.poll();qu2.offer(val);}return qu1.poll();}else  {int size = qu2.size();for (int i = 0; i < size-1; i++) {int val = qu2.poll();qu1.offer(val);}return qu2.poll();}}public int top() {if(empty()) {return -1;}if(!qu1.isEmpty()) {int size = qu1.size();int val = -1;for (int i = 0; i < size; i++) {val = qu1.poll();qu2.offer(val);}return val;}else  {int size = qu2.size();int val = -1;for (int i = 0; i < size; i++) {val = qu2.poll();qu1.offer(val);}return val;}}public boolean empty() {return qu1.isEmpty() && qu2.isEmpty();}
}

3.2 用栈实现队列。

OJ链接

代码如下:

class MyQueue {private Stack stack1;private Stack stack2;public MyQueue() {stack1 = new Stack<>();stack2 = new Stack<>();}public void push(int x) {stack1.push(x);}public int pop() {if(empty()) {return -1;}if(stack2.empty()) {while (!stack1.empty()) {stack2.push(stack1.pop());}}return stack2.pop();}public int peek() {if(empty()) {return -1;}if(stack2.empty()) {while (!stack1.empty()) {stack2.push(stack1.pop());}}return stack2.peek();}public boolean empty() {return stack1.isEmpty() && stack2.isEmpty();}
}

总结

以上就是今天要讲的内容,本文仅仅简单介绍了栈与队列的概念及其使用,栈与队列在解决实际问题中有着很大的作用,我们需要多练习,熟能生巧。

相关内容

热门资讯

秤人添岁立夏忙,青瓷蛋雕绘新光 转自:上观新闻原标题:《【AI绘·二十四节气中的非遗】秤人添岁立夏忙,青瓷蛋雕绘新光》栏目主编:张陌...
乘船时要注意哪些事项?意外落水... 来源:央视新闻客户端 2025年05月04日下午,贵州省黔西市新仁苗族乡六冲河东风库区附近发生载人游...
工业和信息化部:加强通用大模型... 来源:新华社  记者近日从工业和信息化部获悉,下一步将加强通用大模型和行业大模型研发布局,加快建设工...
小观看天丨山洪+地灾预警,返程... 气象万千,小观看天!小伙伴们,早上好!今天是5月5日,星期一。今天迎来立夏节气,也是“五一”假期最后...
两人被捕 事故最终原因仍在确认... 当地时间5月4日,伊朗沙希德拉贾伊港口事故调查委员会公布了最新事故调查报告。报告指出,根据此前的初步...
市场消息:特朗普官员正探索挑战...   据报道,美国总统特朗普政府的官员正在探索挑战非营利组织免税地位的方法。媒体援引熟悉内情的人士的话...
反导系统未能拦截胡塞武装导弹,... 当地时间5月4日,以色列空军对当天胡塞武装向本-古里安机场发射导弹一事进行了调查,初步结果显示拦截失...
立夏节气预警大数据报告:雷电预... 今天(5月5日),我国进入夏季的第一个节气——立夏。这个时节,象征着春天的告别与夏日的开启,气温逐步...
加开列车! 转自:西安发布今天是2025年5月5日星期一(农历四月初八)今日立夏天气预报5日:多云,有浮尘或扬沙...
伊利集团张轶鹏:品质是伊利的最...   由Hehson财经主办的“第十届巴菲特股东大会中美投资人酒会”于美国当地时间5月3日在美国内布拉...
伊利集团张轶鹏:近两年乳企普遍...   由Hehson财经主办的“第十届巴菲特股东大会中美投资人酒会”于美国当地时间5月3日在美国内布拉...
迎难而上再捧苏杯 国羽展现强大... 转自:中国体育报5月4日,在厦门奥林匹克体育中心凤凰体育馆,中国羽毛球队如愿第14次捧起苏迪曼杯,大...
投资前瞻:周四聚焦美联储议息结...   来源:Wind万得  // 市场要闻 //  1、重磅宏观数据公布  5月7日,国家统计局将发...
今日立夏!风暖昼长,万物逐渐繁... 转自:北京日报客户端来源:北京日报客户端记者:胡德成流程编辑:U072
刘文萍到巨鹿县、隆尧县调研检查 转自:邢台网加快高端化智能化绿色化转型 持续塑造产业集群新动能新优势本报讯(记者谢霄凌 通讯员杨佳希...
俄称打击乌多目标,乌称袭击俄防... 俄罗斯国防部5月4日通报称,过去一天,俄军在苏梅、哈尔科夫、顿涅茨克、扎波罗热、赫尔松等方向打击乌军...
华安基金十年老将李欣离职!曾创...   又有资深基金经理官宣离职。  近日,华安基金发布公告,基金经理李欣因个人原因即将离任,新任基金经...
迎难而上再捧苏杯 国羽展现强... 5月4日,在厦门奥林匹克体育中心凤凰体育馆,中国羽毛球队如愿第14次捧起苏迪曼杯,大家激情庆祝这来之...
中国金茂,营收大增、利润下滑,...   来源:基本面力场  中国金茂(0817.HK)是力场君一只在关注的一只房地产股,也是力场君最喜欢...
河北滦平:雨后清晨金山岭长城云... 转自:北京日报客户端5月5日立夏节气,河北省承德市滦平县金山岭长城,迎来降雨天气。雨后清晨,云雾缭绕...