数据结构的栈和队列(这不进来看一看)

出栈时:

在这里插入图片描述

在这里插入图片描述

栈的实现

实现栈一般有两种方法一个为利用顺序表实现另一个为链表实现,在实际情况下,我们使用顺序表实现栈

public class MyStack {

public int[] elem;

public int usedSize;

public MyStack(){

this.elem=new int[10];

}

//判断栈是否为空

public boolean isFull() {

if(usedSize==this.elem.length){

return true;

}

return false;

}

//将元素插入栈当中

public void push(int item) {

if(isFull()){

//如果栈已经填满,则将栈进行2倍扩容

this.elem= Arrays.copyOf(this.elem,2*this.elem.length);

}

this.elem[this.usedSize]=item;

this.usedSize++;

}

public boolean empty() {

//判断栈是否为空,是则返回true,不是则返回false

return this.usedSize==0;

}

public int pop() throws RuntimeException{

if (empty()){

//如果栈为空则抛出异常

throw new RuntimeException(“栈空了”);

}

//返回栈顶元素并从栈中删除栈顶元素

return this.elem[–this.usedSize];

}

public int peek() {

if (empty()){

//如果栈为空则抛出异常

throw new RuntimeException(“栈空了”);

}

//返回栈顶元素但不从栈中删除栈顶元素

return this.elem[this.usedSize-1];

}

}

注意:在java程序中,可以直接使用栈

格式:

Stack 变量名=new Stack<>()

| 方法 | 解释 |

| — | — |

| E push(E item) | 压栈 |

| E pop() | 出栈 |

| E peek() | 查看栈顶元素 |

| boolean empty() | 判断栈是否为空 |

栈的面试题

括号匹配

在这里插入图片描述

题解:

该题考查对栈掌握程度,为了匹配有效括号,我们可以使用使用一个栈,将遇到的左括号都放入栈中,遇到右括号就取出栈顶元素进行比较,如果匹配则删除栈顶,如果不匹配则返回false;循环结束后再判断栈是否为空如果为空则返回true,相反则返回false;

class Solution {

public boolean isValid(String s) {

Stack stack=new Stack<>();

char[] ch=s.toCharArray();

for(char ch1:ch){

switch(ch1){

case ‘(’:

case ‘{’:

case ‘[’:

stack.push(ch1);

break;

case ‘)’:

if(!stack.isEmpty()&&stack.peek()==‘(’){

stack.pop();

}

else{

return false;

}

break;

case ‘]’:

if(!stack.isEmpty()&&stack.peek()==‘[’){

stack.pop();

}

else{

return false;

}

break;

case ‘}’:

if(!stack.isEmpty()&&stack.peek()==‘{’){

stack.pop();

}

else{

return false;

}

break;

}

}

if(stack.isEmpty()){

return true;

}

return false;

}

}

在这里插入图片描述

逆波兰表达式求值

在这里插入图片描述

该题考查我们对前缀算法和中缀算法的熟悉程度,使用一个栈,将数字放入其中当遇到‘+’,‘-’,‘*’,‘/’,则取出栈顶的两个元素,与相应的运算符进行操作

再将新获得的数放入栈中。

class Solution {

public int evalRPN(String[] tokens) {

Stack stack = new Stack<>();

int n = tokens.length;

for (String token:tokens) {

if (isNumber(token)) {

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

} else {

int num2 = stack.pop();

int num1 = stack.pop();

switch (token) {

case “+”:

stack.push(num1 + num2);

break;

case “-”:

stack.push(num1 - num2);

break;

case “*”:

stack.push(num1 * num2);

break;

case “/”:

stack.push(num1 / num2);

break;

default:

break;

}

}

}

return stack.pop();

}

public boolean isNumber(String token) {

return !(“+”.equals(token) || “-”.equals(token) || “*”.equals(token) || “/”.equals(token));

}

}

在这里插入图片描述

队列


队列的概念

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

如图:

在这里插入在图片描述

为了实现队列,可以采用数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。

class Node {

public int data;

public Node next;

public Node(int data) {

this.data = data;

}

}

public class MyQueueLinked {

private Node front;

private Node rear;

private int usedSize;

//插入元素进入队列中

public void offer(int val) {

Node node=new Node(val);

if (front==null){

this.front=node;

this.rear=node;

}

else {

this.rear.next=node;

this.rear=node;

}

this.usedSize++;

}

public int size() {

return this.usedSize;

}

public boolean isEmpty() {

return this.usedSize == 0;

}

//返回栈头元素,并从队列中删除

public int poll() {

if (isEmpty()) {

throw new RuntimeException(“队列为空!”);

}

int val=this.front.data;

if(this.front.next == null) {

this.front = null;

this.rear = null;

}

else {

this.front=this.front.next;

}

this.usedSize–;

return val;

}

//返回栈头元素,但不从队列中删除

public int peek(){

if (isEmpty()) {

throw new RuntimeException(“队列为空!”);

}

return this.front.data;

}

}

循环队列

实际中我们有时还会使用一种队列叫循环队列。如操作系统课程讲解生产者消费者模型时可以就会使用循环队列。环形队列通常使用数组实现。

在这里插入图片描述

循环队列和普通队列一样:队尾加元素,队头输出元素

如何区分循环队列的空与满

循环队列一般会保留一个位置以便于判断是否满了

如图:

在这里插入图片描述

当Q.front==Q.rear时,此时循环队列为空。

在这里插入图片描述

最后

Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
在这里插入图片描述

如何区分循环队列的空与满

循环队列一般会保留一个位置以便于判断是否满了

如图:

在这里插入图片描述

当Q.front==Q.rear时,此时循环队列为空。

在这里插入图片描述

最后

Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
[外链图片转存中…(img-VlUZotc1-1718925657998)]

  • 13
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值