数据结构与算法(二)(栈)

本文详细介绍了栈的基本概念,包括栈的性质、应用场景,如子程序调用、表达式转换等。通过数组模拟栈,展示了如何用栈求解表达式,如2+3*8-5。此外,还解释了前缀、中缀和后缀表达式的规则,以及中缀表达式转后缀表达式的算法和代码实现。
摘要由CSDN通过智能技术生成

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值