package com.stack;public class Calculator {public static void main(String[] args){String expression = "5*6+10-100";// 定义两个栈, 一个是数栈, 一个是操作符栈ArrayStackCal numStack = new ArrayStackCal(10);ArrayStackCal operStack = new ArrayStackCal(10);// 定义需要的相关变量int index = 0;int num1 = 0;int num2 = 0;int oper = 0;int res = 0;char ch = ' ';String chs = "";while(true){// 依次得到express中的每个字符ch = expression.substring(index, index+1).charAt(0);if(operStack.isOper(ch)){if(!operStack.isEmpty()){// 如果操作符栈不为空// 和操作符栈中的操作符比较优先级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);}}else{// 如果是数,直接入数栈//numStack.push(ch-48); // 存入整数,而不是字符chs += ch;if(index == expression.length()-1){numStack.push(Integer.parseInt(chs));}else{char temp = expression.substring(index+1, index+2).charAt(0);if(numStack.isOper(temp)){numStack.push(Integer.parseInt(chs));chs = "";}}}index++;if(index==expression.length()){break;}}operStack.listChar();numStack.list();while(!operStack.isEmpty()){oper = operStack.pop();num1 = numStack.pop();num2 = numStack.pop();res = numStack.cal(num1, num2, oper);numStack.push(res);}res = numStack.pop();System.out.println(expression+"="+res);}
}// 栈
class ArrayStackCal{private int maxSize; //栈的大小 private int[] stack; // 数组模拟栈private int top = -1;public ArrayStackCal(int maxSize){this.maxSize = maxSize;stack = new int[maxSize];}// 判断栈满public boolean isFull(){return top == maxSize - 1;}// 判断栈空public boolean isEmpty(){return top == -1;}// 查看当前栈顶的值public int peek(){return stack[top];}// 入栈public void push(int value){// 先判断栈是否已满if(isFull()){System.out.println("栈已满");return;}top++;stack[top] = value;}// 出栈public int pop(){if(isEmpty()){System.out.println("栈为空");// 跑出异常throw new RuntimeException("栈空,没有数据!");}int value = stack[top];top--;return value;}// 遍历栈public void list(){for(int i=top; i>-1;i--){System.out.printf("stack[%d]=%d\n",i,stack[i]);}}public void listChar(){for(int i=top; i>-1;i--){System.out.printf("stack[%d]=%c\n",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;}return res;}
}

数据结构:栈--计算表达式相关推荐

  1. LeetCode Basic Calculator(用栈计算表达式的值)

    题意:给出一个计算表达式,只包含 +,-,(,),求计算结果 思路:用栈来实现 代码如下: public class Solution {private int cal(int num1, int n ...

  2. 数据结构——栈——中缀表达式和后缀表达式

    什么是中缀表达式,什么是后缀表达式 我们一般看见的多项式计算都是中缀表达式构成的:1+2*3+4/3 类似这种,为什么说是中缀呢?因为它的计算符号都是在两个数中间的. 那么自然而然的明白了后缀表达式是 ...

  3. LeetCode224. Basic Calculator (用栈计算表达式)

    解题思路 用两个栈分别存字符和数字. 顺序读入字符,处理方式分为字符和数字两种. 处理字符分为')'和非')'两种. 处理数字需要读取字符栈栈顶,分为'+'.'-'和非'+'.'-'. 代码 clas ...

  4. 有趣的数据结构算法10——后缀表达式(PRN)介绍及利用栈计算后缀表达式的结果

    有趣的数据结构算法10--后缀表达式(PRN)介绍及利用栈计算后缀表达式的结果 解题思路 实现代码 GITHUB下载连接 在前一天已经利用栈完成2进制到8进制的转换.但是栈的应用方面还有很多,本次我将 ...

  5. c语言小数表达式运算课程设计,数据结构课程设计表达式计算.doc

    数据结构课程设计表达式计算 福建农林大学计算机与信息学院 计算机类 课程设计报告 课程名称:算法与数据结构课程设计题目:表达式计算姓 名:系:数学系专 业:数学与应用数学年 级:学 号:指导教师:宁正 ...

  6. python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图

    python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...

  7. 数据结构-栈--表达式

    数据结构之栈在表达式求值及转换中的应用 1 栈及表达式的基本定义 2 栈在表达式求值过程以及转换中的应用 1 栈及表达式的基本定义 1.1栈的定义 栈(stack)是限定仅在表尾进行插入或删除操作的线 ...

  8. 备战NOI 数据结构——栈与单调栈(stack) 以及后缀表达式

    栈 stack 引入 栈的概念 代码实现 定义和初始化(init) 入栈(push) 出栈(pop) 访问栈顶元素(query) 查询栈的元素个数(size) 判断是否为空(empty) 清空栈(cl ...

  9. PHP计算表达式-栈

    <?php /*** 计算表达式思路* 1+2*3-2* 思路:* 1.扫描每个字符* 2.判断是否运算符和数字* 3.数字直接进栈* 4.运算符* 1.第一个运算符直接入栈* 2.N个运算符要 ...

最新文章

  1. 编译问题一 undefined reference to `EVP_sha1' ‘RAND_byte’ ‘DES_key_sched’ 问题解决
  2. sprint冲刺计划第三天团队任务
  3. 网站策划:如何书写网站的商业计划书
  4. 计算机考研专业综合考试二,2015计算机考研大纲:专业基础综合考试大纲原文(2)...
  5. malloc/free与new/delete的使用要点
  6. vue3.0 word导出
  7. php的变量引用与销毁机制
  8. w ndows7如何清理垃圾,Win7系统清理:如何清理Win7系统盘垃圾
  9. [笔记分享] [GPIO] MSM8x39 GPIO 软件部分小结
  10. 傲梅分区助手 linux,傲梅分区助手(详解磁盘操作)
  11. 利用地图API定制开发电子地图应用系统
  12. Aho-Corasick 算法
  13. 王之泰201771010131《面向对象程序设计(java)》第三周学习总结
  14. The remote device or resource won't accept the connect
  15. 《论文阅读》THE CURIOUS CASE OF NEURAL TEXT DeGENERATION
  16. [解决]IDEA每次启动都会打开Licenses激活弹窗、IDEA打不开
  17. ppt打不开,显示发现文件中的内容有问题。尝试修复此演示文稿无果!
  18. 开篇──纪念调零的百合
  19. 国行Surface Laptop 3评测:微软最佳轻薄本之作
  20. SQL中的查询语句总结(实例)

热门文章

  1. Windows 10:开机显示C:\WINDOWS\system32\config\systemprofile\Desktop不可用 的解决方法
  2. 谈谈常用清除浮动的方法
  3. 混合图 (Standard IO)
  4. 强大Jquery插件,table排序之二
  5. 虚拟键码对照表与ASCII对照表的区别
  6. RTX 2080时代,如何打造属于自己的深度学习机器
  7. oracle基础建表
  8. hibernate xml配置文件
  9. 这里先发布一个,自己写得unityUI的适配的方案(插播)
  10. 马哥学习笔记——shell变量类型