目录
引言
中缀表达式转后缀表达式
逆波兰表达式求值
栈的压入,弹出序列
栈的实现
括号匹配问题
队列
用栈实现队列
1.什么是栈?
一种数据结构,先进后出。
2.什么是Java虚拟机栈?
JVM stack只是JVM当中的一块内存,该内存一般用来存放:局部变量。
3.什么是栈帧?
调用函数的时候,我们会为这个函数开辟一块内存,叫做栈帧,在JVM stack中开辟。
4.JVM的内存分布?
Java虚拟机栈,本地方法栈,堆,方法区,程序计数器。
后缀表达式方便计算机的运算。
中缀:a+b*c
后缀:abc*+
把对应符号放在对应括号的后面
代码实现:1定义常量来标识运算符的优先级;2.借助栈.
给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
有效的算符为 '+'、'-'、'*' 和 '/' 。
每个操作数(运算对象)都可以是一个整数或者另一个表达式。
两个整数之间的除法总是 向零截断 。
表达式中不含除零运算。
输入是一个根据逆波兰表示法表示的算术表达式。
答案及所有中间计算结果可以用 32 位 整数表示。
示例 1:
输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9class 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遍历完整个字符串,栈还不为空的话,栈当中存储的左元素多
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();
}
}