数据结构-栈

定义

限制插入和删除只能在表的末端进行操作,也就是栈顶进行操作。符合先进后出的特点。Java中栈的实现是 通过数组。

例如:把1,2,3,4插入栈中,则存储结构如下:

栈的简单应用-计算器

代码如下:

import java.util.Stack;/** * 实现带括号的四则运算 */public class CalculatorUtil {    public static void main(String[] args) {        System.out.println(CalculatorUtil.Calculator("1 2*3.0 (1 1*3) 5"));    }    public static double Calculator(String expression){        char[] chars = expression.toCharArray();        //存储计算结果        Stack<Double> result=new Stack<>();        //存储操作        Stack<Character> oper=new Stack<>();        //临时存储数值        StringBuilder num=new StringBuilder();        for(int i=0;i<chars.length;i  ){            if(chars[i]==' ' || chars[i]=='-'  || chars[i]=='*' || chars[i]=='/' ){                //数值存入结果栈,并先进行乘除操作                if(!oper.isEmpty() && (oper.peek()=='*' || oper.peek()=='/')){                        dealSum(oper.pop(),result,result.pop(),Double.parseDouble(num.toString()));                }else {                    result.push(Double.parseDouble(num.toString()));                }                //清空临时数值                num.setLength(0);                oper.push(chars[i]);            }else if(chars[i]=='('){                //存储左括号                oper.push(chars[i]);            }else if(chars[i]==')'){                char operLast;                //一致进行出栈操作直到遇到左括号                while ((operLast=oper.pop())!='('){                    dealSum(operLast,result,result.pop(),result.pop());                }            }else {                //拼接数值                num.append(chars[i]);            }        }        if(num.length()>0){            result.push(Double.parseDouble(num.toString()));        }        //将剩余的操作出栈        while (!oper.isEmpty()){            dealSum(oper.pop(),result,result.pop(),result.pop());        }        return result.peek();    }    private static void dealSum(char oper,Stack<Double> result,double numFirst,double numSecond){        switch (oper){            case ' ':                result.push(numFirst numSecond);                break;            case '-':                result.push(numFirst-numSecond);                break;            case '*':                result.push(numFirst*numSecond);                break;            case '/':                result.push(numFirst/numSecond);                break;        }    }}

例如: 1 2.0*3 (1 1*3) 5

把输入的字符串转为字符数组,我们通过两个栈进行操作,result存储计算结果,operate存储操作。

第1轮操作

result: [1]

operate:[]

第2轮操作

result: [1]

operate:[ ]

第3轮操作

result: [1,2.0]

operate:[ ]

第4轮操作

result: [1,2.0]

operate:[ ,*]

第5轮操作

result: [1,6.0]

operate:[ ]

第6轮操作

result: [1,6.0]

operate:[ , ]

第7轮操作

result: [1,6.0]

operate:[ , ,(]

第8轮操作

result: [1,6.0,1]

operate:[ , ,(, ]

第9轮操作

result: [1,6.0,1,1]

operate:[ , ,(, ]

第10轮操作

result: [1,6.0,1,1]

operate:[ , ,(, ,*]

第11轮操作

result: [1,6.0,1,1,3]

operate:[ , ,(, ,*]

第12轮操作

result: [1,6.0,4]

operate:[ , ]

第13轮操作

result: [1,6.0,4]

operate:[ , , ]

第14轮操作

result: [1,6.0,4,5]

operate:[ , , ]

第15轮操作

result: [1,6.0,9]

operate:[ , ]

第16轮操作

result: [1,15.0]

operate:[ ]

第17轮操作

result: [16.0]

operate:[]

来源:https://www.icode9.com/content-4-788301.html

(0)

相关推荐

  • ​LeetCode刷题实战227:基本计算器 II

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  • 方法重载

    方法名必须相同,参数列表不同(类型或个数或排列顺序不同) public static int max(int num1, int num2) { //方法体 } public static doubl ...

  • PHP数据结构-栈的相关逻辑操作

    栈的相关逻辑操作 对于逻辑结构来说,我们也是从最简单的开始.堆栈.队列,这两个词对于大部分人都不会陌生,但是,堆和栈其实是两个东西.在面试的时候千万不要被面试官绕晕了.堆是一种树结构,或者说是完全二叉 ...

  • PHP数据结构-栈和队列的应用

    栈和队列的应用 通过栈和队列的学习,我们似乎会感觉到其实数据结构还是非常简单的嘛.当然,这只是一个开始,我们从顺序表.链表开始,到现在的栈和队列,其实都是为了将来在铺路.在树和图的遍历算法中,都可以见 ...

  • 彻底搞懂CPU特权级上篇(内存特权级)计算机资源包括内存段代码段数据段栈段IO设备核心数据结构

    计算机资源包括内存段代码段数据段栈段IO设备核心数据结构 程序员在用户程序开发过程中,会遇到两个基本概念即用户态和内核态,我们所说的模式切换,就是用户态和内核态之间的切换. 用户态和内核态其实是CPU ...

  • 基本数据结构:栈

    轻松学习基本数据结构-栈 轻松学习基本数据结构-栈 展开

  • Go 数据结构和算法篇(二):栈

    Go语言中文网 今天 以下文章来源于xueyuanjun ,作者xueyuanjun 从逻辑角度来说,数组和链表都是线性结构(就是排成一条线的结构,只有前后两个方向,非线性结构包括树.图等,后面会讲到 ...

  • 【原创】栈和队列的数据结构实现

    栈 #include<stdlib.h> struct stack{ int* number; int n; }; void init_stack(struct stack *s,int  ...

  • 数据结构导论(第三章栈)

    一.栈 栈和队列可看作是特 殊的线性表,它们是 运算受限的线性表 定义:栈是只能在表的一端(表尾)进行 插入和删除的线性表 允许插入及删除的一端(表尾)称为栈顶(Top): . 另一端(表头)称为栈底 ...

  • 全栈认知:应用框架

    [引子] "探索嵌入式应用框架(EAF)" 的那篇文字是应用框架在嵌入式领域的具体示例,实际上,在服务器领域,应用框架更是俯拾皆是.五一假期的时候, 开始为全栈系列填坑,弥补空间维 ...

  • [数据结构] 动图演示 代码实现八大排序(插入、希尔、选择、堆、冒泡、快速、归并、基数/桶)

    2019-04-18 18:22:04 giturtle 码龄3年 关注 排序 1. 插入排序 2. 希尔排序 3. 选择排序 4. 堆排序 5. 冒泡排序 6. 快速排序 1)Hover法 2)挖坑 ...