栈
1.简介
栈是一个先进后出的有序列表,允许插入和删除一端叫做栈顶,另一端为固定端叫栈底
2.应用场景
子程序调用,递归调用,表达式的转换(中缀表达式转后缀表达式)与求值,二叉树的遍历,图形的深度优先搜索法
3.用数组模拟栈
package stack;
public class ArraySatackDemo {
public static void main(String[] args) {
ArrayStack arrayStack = new ArrayStack(5);
arrayStack.push(1);
arrayStack.push(2);
arrayStack.push(3);
arrayStack.push(4);
arrayStack.push(5);
arrayStack.pop();
arrayStack.pop();
arrayStack.seeStack();
}
}
class ArrayStack{
private int maxSize;//栈的最大数量
private int[] stack;//用数组模拟栈
private int top = -1;//栈顶,默认为-1
//构造方法
public ArrayStack(int maxSize){
this.maxSize = maxSize;
stack = new int[maxSize];
}
//入栈push
public void push(int num){
if(top == maxSize-1){
System.out.println("栈已经满啦");
return;
}
top++;
stack[top] = num;
}
//出栈pop
public int pop(){
if(top==-1){
System.out.println("栈为空");
}
int var = stack[top];
top--;
return var;
}
//遍历栈
public void seeStack(){
if(top==-1){
System.out.println("栈为空");
}
for(int i=top;i>=0;i--){
System.out.println(stack[i]);
}
}
}
4.使用栈实现求值
a.比如2+3*8-5
b.思路分析
一.通过index来遍历字符串
二.如果是数字,就存入数字栈
三.如果是符号分为两种情况:①符号栈中没有符号,直接存入 ②符号栈中有符号,如果当前符号运算级别小于或者等于符号栈中的符号,从数字栈中取出两个数字,从符号栈中取出一个符号,运算得到的结果存入数字栈,如果当前符号大于符号栈中的符号,直接存入符号栈
四.当表达式扫描完毕,就顺序取出栈中符号和数字运算
五.最后数字栈中的结果就是运算式的结果
5.代码实现
package stack;
public class Calculator {
public static void main(String[] args) {
String string = "2+3*3-5";
ArrayStack2 numStack = new ArrayStack2(10);
ArrayStack2 opeStack = new ArrayStack2(10);
int index = 0;
int num1;
int num2;
int ope;
int res;
char c;
while(true){
c = string.substring(index,index+1).charAt(0);
if(opeStack.isOperator(c)){
if(opeStack.getTop() == -1){
opeStack.push(c);
}else{
if(opeStack.judgeOperator((char)opeStack.getTopNum()