Java——栈和队列

目录

引言 

中缀表达式转后缀表达式

逆波兰表达式求值 

栈的压入,弹出序列

栈的实现

括号匹配问题

队列

用栈实现队列

 


 

引言 

1.什么是栈?

一种数据结构,先进后出。

2.什么是Java虚拟机栈?

JVM stack只是JVM当中的一块内存,该内存一般用来存放:局部变量。

3.什么是栈帧?

调用函数的时候,我们会为这个函数开辟一块内存,叫做栈帧,在JVM stack中开辟。

4.JVM的内存分布?

Java虚拟机栈,本地方法栈,堆,方法区,程序计数器。

中缀表达式转后缀表达式

后缀表达式方便计算机的运算。

中缀:a+b*c

后缀:abc*+

把对应符号放在对应括号的后面

Java——栈和队列_第1张图片

 

代码实现:1定义常量来标识运算符的优先级;2.借助栈.

逆波兰表达式求值 

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

注意:

有效的算符为 '+'、'-'、'*' 和 '/' 。
每个操作数(运算对象)都可以是一个整数或者另一个表达式。
两个整数之间的除法总是 向零截断 。
表达式中不含除零运算。
输入是一个根据逆波兰表示法表示的算术表达式。
答案及所有中间计算结果可以用 32 位 整数表示。

 

示例 1:

输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

class Solution {
    public int evalRPN(String[] tokens) {
        Stack stack=new Stack<>();
        for(int i=0;i

 

栈的压入,弹出序列

 

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。

 

示例 1:

输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
输出:true
解释:我们可以按以下顺序执行:
push(1), push(2), push(3), push(4), pop() -> 4,
push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

定义i指向push数组中第一个元素 ,j指向popA的第一个元素 ,

1. 遍历pushA数组并且把pushA数组中的元素依次压入栈中 ,

2. 获取栈顶元素和当前j下标元素是否一样。

3.如果一样则弹出。j++;

注意:栈是否是空?

class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        Stack stack=new Stack<>();
        int i=0;
        int j=0;
        for(i=0;i

 

 

栈的实现

/**利用顺序表实现采用尾插尾删,时间复杂度是O(1)
 *假设入栈是尾插,时间复杂度是O(N),因为每次尾插都得找尾巴
 *头插法入栈,时间复杂度是O(1),出栈的时候,只需要删除头节点(出栈),时间复杂度是O(1)
 *但是如果非要尾插?就算入栈是O(1),对于出栈因为是单链表,即使最后一个节点我们知道是谁,
 * 但是他的前一个节点我们就不知道了,还得遍历去找这个节点的前驱,时间复杂度又是O(n)所以他最终就是用双向链表来实现一个栈。
 * ***/
E push(E item)  压栈
E pop()  出栈
E peek()  查看栈顶元素
boolean empty()  判断栈是否为空

 

括号匹配问题

有效的字符 

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

输入:s = "()[]{}"
输出:true

1.是左符号的话,入栈;

2.是右括号:判断【i】与栈顶元素peek()是否匹配 ;

如果匹配:则出栈。

3.因为栈当中存储的是左括号,当i遍历完整个字符串,栈还不为空的话,栈当中存储的左元素多

Java——栈和队列_第2张图片

队列

LinkedList->Deque->queue->Collections->Iterable(对于LinkedList来说,可以当作普通的队列,双端队列,双向链表,栈。)先进先出。

offer(),入队

poll(),出队

peek(),队首元素

 

用栈实现队列

//入都入第一个栈,
//出统一出第二个栈的元素,如果哦第二个栈是空,那么把第一个栈所有的元素全倒过来,然后出栈顶元素


//入都入第一个栈,
//出统一出第二个栈的元素,如果哦第二个栈是空,那么把第一个栈所有的元素全倒过来,然后出栈顶元素
class MyQueue {
    private Stack a;// 输入栈
    private Stack b;// 输出栈
    
    public MyQueue() {
        a = new Stack<>();
        b = new Stack<>();
    }
    
    public void push(int x) {
        a.push(x);
    }
    
    public int pop() {
        // 如果b栈为空,则将a栈全部弹出并压入b栈中,然后b.pop()
        if(b.isEmpty()){
            while(!a.isEmpty()){
                b.push(a.pop());
            }
        }
        return b.pop();
    }
    
    public int peek() {
        if(b.isEmpty()){
            while(!a.isEmpty()){
                b.push(a.pop());
            }
        }
        return b.peek();
    }
    
    public boolean empty() {
        return a.isEmpty() && b.isEmpty();
    }
}

 

 

 

你可能感兴趣的:(java,jvm,开发语言)