CSDN的各位友友们你们好,今天千泽为大家带来的是
栈的深入学习,
接下来让我们一起开始手撕数据结构吧!
如果对您有帮助的话希望能够得到您的支持和关注,我会持续更新的!
一、栈的定义
1. 栈的概念
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈
顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
2. 栈的图解
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据在栈顶。
可以看出,入栈和出栈会改变栈顶.
3.栈的几种主要基本操作:
void push(int data):入栈(将数据data插入到栈中)
int pop():出栈(删除并返回最后一个插入栈的元素)
int top():返回最后一个插入栈的元素,但不删除
int size():返回存储在栈中的元素个数
boolean isEmpty():返回栈是否是空栈
boolean isFull():返回是否是满栈
void Clear():清除整个栈
二、栈的模拟实现
Java集合中的Stack类在底层是一个顺序表 , 那么我们可以简单的用一个数组来模拟栈
import java.util.Arrays;
public class MyStack {
public int [] elem;
public int usedSize;
public MyStack() {
this.elem = new int [5];
}
public void push(int val){
if(isFull()){
this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
}
this.elem[this.usedSize] = val;
this.usedSize++;
}
public boolean isFull(){
return this.usedSize == elem.length;
}
public int pop(){
if(isEmpty()){
throw new RuntimeException("栈为空!");
}
int OldValue = this.elem[usedSize - 1];
this.usedSize--;
return OldValue;
}
public int peek(){
if(isEmpty()){
throw new RuntimeException("栈为空!");
}
return this.elem[usedSize - 1];
}
public boolean isEmpty(){
return this.usedSize == 0;
}
}
友友们可以动手实践一下,数据结构一定要多写多画图多总结!
三.栈的经典使用场景-逆波兰表达式
现在,我们了解了栈的相关代码写法, 那么我们一起来看一下栈在题目中的应用
150. 逆波兰表达式求值
https://leetcode.cn/problems/evaluate-reverse-polish-notation/
解法
public class 逆波兰 {
int i = 0 ;
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
for(int i = 0; i < tokens.length; i++){
String val = tokens[i];
if(isOperation(val) == false){
stack.push(Integer.parseInt(val));
}else {
int num1 = 0;
int num2 = 0;
switch (val){
case "+":
num2 = stack.pop();
num1 = stack.pop();
stack.push(num1 + num2);
break;
case "-":
num2 = stack.pop();
num1 = stack.pop();
stack.push(num1 - num2);
break;
case "*":
num2 = stack.pop();
num1 = stack.pop();
stack.push(num1 * num2);
break;
case "/":
num2 = stack.pop();
num1 = stack.pop();
stack.push(num1 / num2);
break;
}
}
}
return stack.pop();
}
public boolean isOperation(String str){
if(str.equals("+") || str.equals("-") || str.equals("*") || str.equals("/")){
return true;
}
return false;
}
}
四.栈的其他常见应用实例
符号匹配
HTML和XML文件中的标签匹配(实质还是符号匹配)
实现函数调用
文本编辑器中的撤销
网页浏览器中已访问页面的历史记录
作为一个算法的辅助数据结构
随堂小练习:
进制转换,由十进制转化为八进制或二进制
首先熟悉进制转换的步骤,可以网上查询。比如十进制转换为八进制(1087)10
1.1087除以8得135余7
2.135除以8得16余7
3.16除以8得2余0
4.2除以8得0余2
因此转化为八进制为(2077)8以上得出来的是从后到前的结果,可以实例到栈类型中,利用栈的抽象模型,将先算出来的余数放入栈中,算完后,再从栈顶中取出,结果正好是计算的结果,满足先进后出的原则,可以画图理解一下,
思路:
首先定义一个栈,计算得出的余数入栈,然后再出栈,得出来的数就是结果
首先定义一个栈
然后定义一个入栈的实例化函数,
小伙伴们来动手实现一下吧!
总结
今天栈的相关内容就到这里,祝你学习进步,感谢你的支持!