计算式:7*2*2-5+1-5*3-3=? 计算机底层是如何运算得到结果的?注意不是简单的把算是列出运算,因为我们看这个算式722-5,但是计算机怎么理解这个算式的(对计算机而言,它接收到的就是一个字符串),我们讨论的是这个问题。–>栈 入栈演示: 用栈实现计算器 毕竟编程我是初学者,难免有理解错误的地方,希望大家看完之后,发现错误可以评论出来,谢谢大家栈的应用场景与介绍
栈的介绍
出入栈的概念(如图所示)

出栈演示:

栈的应用场景
数组模拟栈的思路分析图

top来表示栈顶,初始化为-1top++;stack[top]=data;int value=stack[top];top--,return valuel;代码实现
package DataType; import java.util.Scanner; public class ArrayStackDemo { public static void main(String[] agrs){ //测试一些ArrayStack是否正确 //先创建一个对象表示栈 ArraySatck satck = new ArraySatck(4); String key = ""; boolean loop =true;//控制是否退出菜单 Scanner scanner = new Scanner(System.in); while (loop){ System.out.println("show:表示显示栈"); System.out.println("exit:退出程序"); System.out.println("push:表示添加数据(入栈)"); System.out.println("show:表示取出数据(出栈)"); System.out.println("请输入你的选择:"); key = scanner.next(); switch (key){ case "show": satck.list(); break; case "push": System.out.println("请输入一个数:"); int value = scanner.nextInt(); satck.push(value); break; case "pop": try{ int res = satck.pop(); System.out.println("出栈的数据是:" + res); }catch (Exception e){ // TODO:handle exception System.out.println(e.getMessage()); } break; case "exit":{ scanner.close(); loop = false; break; } default: break; } } System.out.println("程序已退出!"); } } //定义一个类来表示栈 class ArraySatck{ private int maxSize;//栈的大小 private int[] stack;//数组,数组模拟栈,数据就放在该数组 private int top = -1;//top表示栈顶,初始化为-1 //构造器 public ArraySatck(int maxSize){ this.maxSize = maxSize; stack = new int[this.maxSize]; } //栈满 public boolean isFull(){ return top == maxSize - 1; } //栈空 public boolean isEmpty(){ return top == -1; } //入栈push public void push(int value){ //先判断栈是否满 if (isFull()){ System.out.println("栈满~~"); return; } top++; stack[top] = value; } //出栈pop,将栈顶的数据返回 public int pop(){ //先判断栈是否空 if (isEmpty()){ //抛出异常 throw new RuntimeException("栈空~~没有数据~~"); } int value = stack[top]; top --; return value; } //显示栈,遍历栈,遍历时需要从栈顶开始显示数据 public void list(){ if (isEmpty()){ System.out.println("栈空没有数据~~"); } for (int i = top ; i >= 0;i --){ System.out.printf("stack[%d]=%dn",i,stack[i]); } } } 栈实现综合计算器
要求
思路分析

index值(索引),来遍历我们的表达式
1. 如果发现当前符号栈为空,就直接入栈
2. 如果符号栈有操作符,就进行比较,如果当前的操作符的优先级小于或者等于栈中的操作符,就需要从数栈中pop出两个数,再从符号栈中pop一个符号,进行运算,将得到结果,入数栈,然后将当前操作符入符号栈,如果当前的操作符的优先级大于等于栈中的操作符,就直接入符号栈。代码实现
package DataType; public class Calculator { public static void main(String[] args){ //根据前面思路,完成表达式的运算 String expression = "25*2*10+2*8+4"; //创建两个栈,数栈,符号栈 ArraySatck2 numStack = new ArraySatck2(10); ArraySatck2 operStack = new ArraySatck2(10); //定义需要的相关变量 int index = 0;//用于扫描 int num1 = 0; int num2 = 0; int oper = 0; int res = 0; char ch = ' ';//将每次扫描得到的char保存到ch中 String keepNum = "";//用于拼接多位数 //开始循环扫描expression while (true){ //依次得到expression的每一个字符 ch = expression.substring(index,index +1 ).charAt(0); //判断ch是什么,然后做相应的处理 if (operStack.isOper((ch))){//如果是运算符 //判断当前符号栈是否为空 if (!operStack.isEmpty()){ //不为空的处理 //思路分析第三条 //如果当前的操作符的优先级小于或者等于栈中的操作符,就需要从数栈中pop出两个数,再从符号栈中pop一个符号,进行运算,将得到结果,入数栈,然后将当前操作符入符号栈 if (operStack.priority(ch) <= operStack.priority(operStack.peek())){ num1 = numStack.pop(); num2 = numStack.pop(); oper = operStack.pop(); res = numStack.cal(num1,num2,oper); //把运算结果入数栈 numStack.push(res); //把当前操作符入入符号栈 operStack.push(ch); }else { //如果当前的操作符的优先级大于等于栈中的操作符,就直接入符号栈。 operStack.push(ch); } }else { //如果为空直接入栈 operStack.push(ch);//例如1+1,前面没有符号。则直接把 + 放入 } }else {//如果是数。则直接入数栈 //numStack.push(ch); 这样写是不对的:比如"1+3",扫描到的是这个"1",而不是 1 //numStack.push(ch - 48);这样也不对 //分析思路 //1.当处理多位数时,不能发现一个一个数就历即入栈,因为他可能多位数 //2.在处理数,需要向expression的表达式后面index后再看一位,如果是数就继续扫描,如果是符号就入栈 //3.因此我们需要定义一个变量 字符串,用于拼接 //处理多位数 keepNum += ch; //如果ch已经是最后一位了,则直接入栈 if (index == expression.length() - 1){ numStack.push(Integer.parseInt(keepNum)); }else { //判断下一位字符是不是数字,如果是数字,则继续扫描,如果是运算符则入栈 //注意是看后一位,不是index++ if (operStack.isOper(expression.substring(index + 1,index + 2).charAt(0))){ //如果后一位是运算符则入栈,keepNum为字符串,需要转换为int numStack.push(Integer.parseInt(keepNum)); //重要!!!!!!,keepNum清空 keepNum = ""; } } } //让index + 1;并且判断是否到达expression最后 index ++; if (index >= expression.length()){ break;//扫描结束 } } //当表达式扫描完毕之后,就顺序的从数栈和符号栈中pop出相应的数和符号,并且运算 while (true){ //如果符号栈为空,则计算结束,得到最后结果,数栈中最后的数值就是结果 if (operStack.isEmpty()){ break; } num1 = numStack.pop(); num2 = numStack.pop(); oper = operStack.pop(); res = numStack.cal(num1,num2,oper); numStack.push(res);//入栈 } //将数栈的最后结果输出 System.out.println("表达式" + expression + "的结果为:" + numStack.pop()); } } //先创建一个栈,直接使用前面创建好的 //定义一个类ArraySatck2来表示栈,需要扩展功能 class ArraySatck2{ private int maxSize;//栈的大小 private int[] stack;//数组,数组模拟栈,数据就放在该数组 private int top = -1;//top表示栈顶,初始化为-1 //构造器 public ArraySatck2(int maxSize){ this.maxSize = maxSize; stack = new int[this.maxSize]; } //增加一个方法,可以返回栈顶的值,并不会被取出 public int peek(){ return stack[top]; } //栈满 public boolean isFull(){ return top == maxSize - 1; } //栈空 public boolean isEmpty(){ return top == -1; } //入栈push public void push(int value){ //先判断栈是否满 if (isFull()){ System.out.println("栈满~~"); return; } top++; stack[top] = value; } //出栈pop,将栈顶的数据返回 public int pop(){ //先判断栈是否空 if (isEmpty()){ //抛出异常 throw new RuntimeException("栈空~~没有数据~~"); } int value = stack[top]; top --; return value; } //显示栈,遍历栈,遍历时需要从栈顶开始显示数据 public void list(){ if (isEmpty()){ System.out.println("栈空没有数据~~"); } for (int i = top ; i >= 0;i --){ System.out.printf("stack[%d]=%dn",i,stack[i]); } } //返回运算符的优先级,优先级是程序员来确定的,优先级使用数字表示 //数字越大,则优先级越高。 public int priority(int oper){ if (oper == '*' || oper == '/'){ return 1; }else if (oper == '+' || oper == '-'){ return 0; }else { return -1;//假定目前的表达式只有+,-,*,/四种运算符 } } //判断是不是一个运算符 public boolean isOper(char val){ return val == '+' || val == '-' || val == '*' || val == '/'; } // //计算方法 public int cal(int num1,int num2,int oper){ int res = 0;//用于存放计算的结果 switch (oper){ case '+': res = num1 + num2; break; case '-': res = num2 - num1; break; case '*': res = num1 * num2; break; case '/': res = num2 / num1; break; default: break; } return res; } }
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算
官方软件产品操作指南 (170)