栈(Stack)
概念
栈
:一种特殊的线性表,其
只允许在固定的一端进行插入和删除元素操作
。进行数据插入和删除操作的一端称为栈
顶,另一端称为栈底。栈中的数据元素遵守后进先出
LIFO
(
Last In First Out
)的原则。即最先进去的数据会在最后面出来,以此类推。
压栈:栈的插入操作叫做进栈
/
压栈
/
入栈,
入数据在栈顶
。
出栈:栈的删除操作叫做出栈。
出数据在栈顶
。
![](https://i-blog.csdnimg.cn/direct/07b9f5ba04534cdaa273c56768fc85ab.png)
栈的使用
方法
|
功能
|
Stack()
|
构造一个空的栈
|
E push(E e)
|
将
e
入栈,并返回
e
|
E pop()
|
将栈顶元素出栈并返回
|
E peek()
|
获取栈顶元素
|
int size()
|
获取栈中有效元素个数
|
boolean empty()
|
检测栈是否为空
|
实现代码如下:
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(12);
stack.push(23);
stack.push(34);
System.out.println(stack.pop());
System.out.println(stack.peek());
System.out.println(stack.size());
System.out.println(stack.empty());
}
}
运行结果如图:
栈的模拟实现
示例代码如下:
public class Mystack {
int[] elem;
int usedSize;
public Mystack(){
this.elem =new int[5];
}
public int pop(){
if (empty()){
throw new StackEmptyException("栈为空!");
}
return elem[--usedSize];
}
public int peek(){
if (empty()){
throw new StackEmptyException("栈为空!");
}
return elem[usedSize-1];
}
public void push(int val){
if (isFull()){
elem = Arrays.copyOf(elem,2*elem.length);
}
elem[usedSize] = val;
usedSize++;
}
public boolean isFull(){
return usedSize == elem.length;
}
public boolean empty(){
return usedSize == 0;
}
}
栈的题目
逆波兰表达式
给你一个字符串数组 tokens
,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
- 有效的算符为
'+'
、'-'
、'*'
和'/'
。 - 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
- 两个整数之间的除法总是 向零截断 。
- 表达式中不含除零运算。
- 输入是一个根据逆波兰表示法表示的算术表达式。
- 答案及所有中间计算结果可以用 32 位 整数表示。
示例 1:
输入:tokens = ["2","1","+","3","*"] 输出:9 解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
示例 2:
输入:tokens = ["4","13","5","/","+"] 输出:6 解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
示例 3:
输入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"] 输出:22 解释:该算式转化为常见的中缀算术表达式为: ((10 * (6 / ((9 + 3) * -11))) + 17) + 5 = ((10 * (6 / (12 * -11))) + 17) + 5 = ((10 * (6 / -132)) + 17) + 5 = ((10 * 0) + 17) + 5 = (0 + 17) + 5 = 17 + 5 = 22
提示:
1 <= tokens.length <= 104
tokens[i]
是一个算符("+"
、"-"
、"*"
或"/"
),或是在范围[-200, 200]
内的一个整数
代码如下:
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
for(String s : tokens){
if(!isOpera(s)){
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();
}
public boolean isOpera(String s){
if(s.equals("+") || s.equals("-") ||s.equals("*")||s.equals("/")){
return true;
}
return false;
}
}