逆波兰法(计算器)程序<无符号版>

涉及队列、栈的运用。

Java中队列可以用:

Queue<String> q = new LinkedList();

来声明,其主要的方法有:

poll(),peak(),offer(),clear(),size()等。

Java中栈可以用:

Stack s = new Stack();

来声明,其主要方法有:
push(),peak(),pop(),clear(),size()等。

  1 package preTest;
  2
  3 import java.util.LinkedList;
  4 import java.util.Queue;
  5 import java.util.Scanner;
  6 import java.util.Stack;
  7
  8 //逆波兰表示法
  9 public class nbl {
 10     public static Stack sigStack = new Stack();
 11     public static Queue<String> nblQueue = new LinkedList();
 12     public static Stack numFromQueue = new Stack();
 13     public static void main(String[] args) {
 14         Scanner in=new Scanner(System.in);
 15         while(in.hasNext()){
 16             String str = in.nextLine();
 17             int result = cal(str);
 18             System.out.println(result);
 19         }
 20     }
 21
 22     public static int cal(String str){
 23         sigStack.clear();
 24         nblQueue.clear();
 25         StringBuilder sb = new StringBuilder();
 26         int len = str.length();
 27         int result= 0;
 28         //压栈和入队操作
 29         for(int i=0; i<len;i++){
 30             char c = str.charAt(i);
 31             if(c>=‘0‘ && c <=‘9‘){
 32                 sb.append(c);
 33                 if(i==len-1){
 34                     nblQueue.offer(sb.toString());
 35                 }
 36             }else{
 37                 nblQueue.offer(sb.toString());
 38                 sb.replace(0, sb.length(), "");
 39                 if(sigStack.size() == 0){
 40                     sigStack.push(c);
 41                 }else{
 42                     char existed = (char)sigStack.peek();
 43                     //如果已经压栈的符号优先级>=当前符号c,则完成压栈符号的操作
 44                     if(c==‘+‘ || c==‘-‘){
 45                         zhengli();
 46                         sigStack.push(c);
 47                         //当两个都是乘除运算时
 48                     }else if(existed ==‘*‘ || existed == ‘/‘){
 49                         tinyAdjust(c);
 50                     }else{//新符号乘除,旧符号加减
 51                         sigStack.push(c);
 52                     }
 53                 }
 54             }
 55         }
 56         zhengli();
 57         //出队操作
 58         numFromQueue.clear();
 59         result = releaseQueue();
 60         return result;
 61     }
 62
 63     public static void zhengli(){
 64         while(sigStack.size() > 0){
 65             char c = (char)sigStack.pop();
 66             nblQueue.offer(new StringBuilder().append(c).toString());
 67         }
 68     }
 69
 70     public static void tinyAdjust(char c){
 71         char ch = (char)sigStack.pop();
 72         nblQueue.offer(new StringBuilder().append(ch).toString());
 73         sigStack.push(c);
 74     }
 75
 76     public static int releaseQueue(){
 77         int len = nblQueue.size();
 78         boolean isNum = false;
 79         for(int i=0; i<len; i++){
 80             isNum = judge();
 81             if(isNum){
 82                 int num = Integer.parseInt(nblQueue.poll());
 83                 numFromQueue.push(num);
 84             }else{
 85                 int a = (int)numFromQueue.pop();
 86                 int b = (int)numFromQueue.pop();
 87                 char c = nblQueue.poll().charAt(0);
 88                 int res = compute(b,a,c);
 89                 numFromQueue.push(res);
 90             }
 91         }
 92         return (int)numFromQueue.pop();
 93     }
 94
 95     public static boolean judge(){
 96         String str = nblQueue.peek();
 97         char c = str.charAt(0);
 98         if(c>=‘0‘ && c<=‘9‘){
 99             return true;
100         }else{
101             return false;
102         }
103     }
104
105     //简单加减乘除计算
106         public static int compute(int a, int b, char c){
107             int result = 0;
108             switch(c){
109             case ‘+‘: result = a+b;
110                 break;
111             case ‘-‘: result = a-b;
112                 break;
113             case ‘*‘: result = a*b;
114                 break;
115             case ‘/‘: result = a/b;
116                 break;
117             }
118             return result;
119         }
120
121 }
时间: 2024-10-12 06:37:37

逆波兰法(计算器)程序<无符号版>的相关文章

逆波兰法求解数学表达示(C++)

主要是栈的应用,里面有两个函数deleteSpace(),stringToDouble()在我另一篇博客当中:对string的一些扩展函数. 本程序只是基本的功能实现,没有差错控制. #include<iostream> #include<stack> #include<string> #include<map> #include"fstring.h" /* *采用逆波兰表示法求解数学表达示 *1.将输入的中缀表示示转换成后缀表达示 *2

栈实现综合计算器(中缀表达式),前缀,中缀,后缀表达式,逆波兰计算器

思路: 代码:实现多位数的运算 public class Calculator { public static void main(String[] args) { //根据前面老师思路,完成表达式的运算 String expression = "7*2*2-5+1-5+3-4"; // 15//如何处理多位数的问题? //创建两个栈,数栈,一个符号栈 ArrayStack2 numStack = new ArrayStack2(10); ArrayStack2 operStack =

逆波兰表达式

1696:逆波兰表达式 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4.本题求解逆波兰表达式的值,其中运算符包括+ - * /四个. 输入 输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数. 输出 输出为一行,表达式的值.可直接用prin

中缀输入逆波兰计算器程序part1

在看K&R的时候,里面提到了逆波兰表示法,老实说看得我迷迷糊糊的,主要是这种反人类的后缀表示法做出的计算器,一般人根本就不知道怎么输入好吧.今天看书的时候,看到了将中缀表达式转为后缀表达式的方法才恍然大悟,原来是少了这一步.这下我就知道该如何做一个可用的逆波兰计算器了. 先简单介绍一下如何完成这步转换吧.中缀表达式就是我们习惯的表达式,比如:1+2*3 考虑运算符优先级的话后缀表达式则应该写成123*+ 写成后缀表达式的形式后我们可以利用栈轻松地解决计算问题,思路是当见到一个数时就把它推入栈:在

逆波兰表示法

逆波兰表示发是一种将运算符写在操作数后面的描述程序(算式)的方法.举个例子,我们平常用中缀表示法描述的算式(1 + 2) * (5 + 4),改为逆波兰表示法之后则是1 2 + 5 4 + *.相较于中缀表示法,逆波兰表示法的优势在于不需要括号. 请输出以逆波兰表示法输入的算式的计算结果. 输入   在1行中输入1个算式.相邻的符号(操作数或运算符)用1个空格隔开. 输出   在1行之中输出计算结果. 限制   2≤算式中操作数的总数≤100 1≤算式中运算符的总数≤99 运算符仅包括"+&qu

后缀表达式(逆波兰表达式)计算器

package datastructure.stack; import java.util.*; /** * <h3>netty_lecture</h3> * <p>逆波兰计算器</p> * 1+((2+3)*4)-5 ==> 1 2 3 + 4 * + 5 1 * @author : myron * @date : 2020-03-18 23:48 **/ public class PolandNotation { private static fi

HDU1237 简单计算器 【栈】+【逆波兰式】

版本:1.0 日期:2014.5.17 2014.6.1 版权:© 2014 kince 转载注明出处 在介绍SwitchButton之前,先来看一下系统Button是如何实现的.源码如下: @RemoteView public class Button extends TextView { public Button(Context context) { this(context, null); } public Button(Context context, AttributeSet att

c# 逆波兰式实现计算器

语文不好,不太会组织语言,希望不要太在意. 如题,先简要介绍一下什么是逆波兰式  通常我们在写数学公式的时候  就是a+b+c这样,这种表达式称为中缀表达式,逆波兰式又称为后缀表达式,例如a+b 后缀表达式就为ab+ 而把中缀表达式转为逆波兰式也是很容易的,以下算法摘自百度百科 简要说一下栈,栈是一种先进后出的对象集合,可以把栈理解为一个桶,先进后出  Stack   Peek()是取出但是不剔除 做比较的时候用,Pop()是出栈,Push()入栈 首先需要分配2个栈,一个作为临时存储运算符的栈

java移位运算符实验程序:&lt;&lt;(左移)、&gt;&gt;(带符 号右移)和&gt;&gt;&gt;(无符号右移)

public class txs { static void leftbit(){ int i;               //整型长度为32位                                                                                          //位 int num=0xFFFFFFE;  //1111 1111 1111 1111 1111 1111 1110      //28 for(i=0;i<28;i++