算术表达式系列之后缀表达式求值

  1 package data.struct.algorithm;
  2
  3 import java.io.BufferedReader;
  4 import java.io.IOException;
  5 import java.io.InputStreamReader;
  6
  7 class Stackfix2 {
  8     private int maxSize;
  9     private int stackArr[];
 10     private int top;
 11
 12     public Stackfix2(int maxSize) {
 13         this.maxSize = maxSize;
 14         stackArr = new int[maxSize];
 15         top = -1;
 16     }
 17
 18     // 进栈
 19     public void push(int value) {
 20         stackArr[++top] = value;
 21     }
 22
 23     // 出栈
 24     public int pop() {
 25         return stackArr[top--];
 26     }
 27
 28     // 显示栈顶元素
 29     public int peek() {
 30         return stackArr[top];
 31     }
 32
 33     // 判断栈是否为空
 34     public boolean isEmpty() {
 35         return top == -1;
 36     }
 37
 38     public boolean isFull() {
 39         return top == maxSize - 1;
 40     }
 41 }
 42
 43 class Postfix {
 44     private Stackfix2 theStackfix2;
 45     private String input;
 46
 47     public Postfix(String in) {
 48         input = in;
 49     }
 50
 51     public int doCalculate() {
 52         int num1;
 53         int num2;
 54         int inresult;
 55         char ch;
 56         int j;
 57         theStackfix2 = new Stackfix2(20);
 58         for (j = 0; j < input.length(); j++) {
 59             ch = input.charAt(j);
 60             // 如果字符为整数,则进行类型强制转换,并压入栈中
 61             if (ch >= ‘0‘ && ch <= ‘9‘) {
 62                 theStackfix2.push((int) (ch - ‘0‘));
 63             } else {
 64                 // 测试用例最最关键的位置,考虑计算过程中的操作数的位置
 65                 // 先弹出栈的元素是第二个操作数,后弹出栈的是第一个操作数
 66                 num2 = theStackfix2.pop();
 67                 num1 = theStackfix2.pop();
 68                 switch (ch) {
 69                 case ‘+‘:
 70                     inresult = num1 + num2;
 71                     break;
 72                 case ‘-‘:
 73                     inresult = num1 - num2;
 74                     break;
 75                 case ‘*‘:
 76                     inresult = num1 * num2;
 77                     break;
 78                 case ‘/‘:
 79                     inresult = num1 / num2;
 80                     break;
 81                 default:
 82                     inresult = 0;
 83                     break;
 84                 }
 85                 theStackfix2.push(inresult);
 86             }
 87         }
 88         return theStackfix2.pop();
 89     }
 90 }
 91
 92 public class PostfixValue {
 93
 94     /**
 95      * @param args
 96      * @throws IOException
 97      */
 98     public static void main(String[] args) throws IOException {
 99
100         while (true) {
101             System.out.println("Enter a Postfix:");
102             System.out.flush();
103             String input;
104             int result;
105             input = getString();
106             Postfix parse = new Postfix(input);
107             result = parse.doCalculate();
108             System.out.println("Postfix求值的结果是:" + result);
109         }
110     }
111
112     public static String getString() throws IOException {
113         InputStreamReader isr = new InputStreamReader(System.in);
114         BufferedReader bufr = new BufferedReader(isr);
115         return bufr.readLine();
116     }
117
118 }
时间: 2024-10-02 01:05:18

算术表达式系列之后缀表达式求值的相关文章

中缀表达式转换成后缀表达式并求值

算法: 中缀表达式转后缀表达式的方法: 1.遇到操作数:直接输出(添加到后缀表达式中) 2.栈为空时,遇到运算符,直接入栈 3.遇到左括号:将其入栈 4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出. 5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈 6.最终将栈中的元素依次出栈,输出. 例如 a+b*c+(d*e+f)*g ----> abc*+de*f+g*+ 遇到a:直接输出: 后缀表达式:a 堆栈:空 遇到

数据结构实验之栈三:后缀式求值

数据结构实验之栈三:后缀式求值 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 对于一个基于二元运算符的后缀表示式(基本操作数都是一位正整数),求其代表的算术表达式的值. 输入 输入一个算术表达式的后缀式字符串,以'#'作为结束标志. 输出 求该后缀式所对应的算术表达式的值,并输出之. 示例输入 59*684/-3*+# 示例输出 57 提示 基本操作数都是一位正整数! 来源 示例程序 #include <stdio.h>

数据结构实验之栈三:后缀式求值 (stack)

数据结构实验之栈三:后缀式求值 Time Limit: 1000MS Memory limit: 65536K 题目描述 对于一个基于二元运算符的后缀表示式(基本操作数都是一位正整数),求其代表的算术表达式的值. 输入 输入一个算术表达式的后缀式字符串,以‘#’作为结束标志. 输出 求该后缀式所对应的算术表达式的值,并输出之. 示例输入 59*684/-3*+# 示例输出 57 1 #include<stdio.h> 2 #include<string.h> 3 #include&

中缀表达式转化为后缀表达式

后缀表达式 逆波兰记法中,操作符置于操作数的后面.例如表达"三加四"时,写作"3 4 +",而不是"3 + 4".如果有多个操作符,操作符置于第二个操作数的后面,所以常规中缀记法的"3 - 4 + 5"在逆波兰记法中写作"3 4 - 5 +":先3减去4,再加上5.使用逆波兰记法的一个好处是不需要使用括号.例如中缀记法中"3 - 4 * 5"与"(3 - 4)*5"不

将中缀表达式转化为后缀表达式

我们把平时所用的标准四则运算表达式,即“9+(3-1)*3+10/2"叫做中缀表达式.因为所有的运算符号都在两数字的中间,现在我们的问题就是中缀到后缀的转化. 中缀表达式“9+(3-1)*3+10/2”转化为后缀表达式“9 3 1-3*+ 10 2/+” 规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分:若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于找顶符号(乘除优先加减)则栈顶元素依次出找并输出,并将当前符号进栈,一直到最终输出后缀表达式为止.

栈的应用之中缀表达式转化为后缀表达式(逆波兰表达式)

1 #include<stdio.h> 2 #include<stdlib.h> 3 4 #define OK 1 5 #define ERROR 0 6 #define STACK_INIT_SIZE 20 7 #define STACK_INCREMENT 10 8 9 typedef char Elemtype; 10 typedef int Status; 11 12 typedef struct StackNode{ 13 Elemtype* base; 14 Elemt

[Swust OJ 322]--东6宿舍灵异事件(中缀表达式转化为后缀表达式的简单运用)

题目链接:http://acm.swust.edu.cn/problem/322/ Time limit(ms): 1000 Memory limit(kb): 65535 Description 将军听说最近东6闹鬼了,作为一个无神论者,将军当然不相信.但是这个传言已经泛滥了,许多人都在说这个事情,将军从每个人那里听到一个传言,将军可以容易的就知道这个传言是真还是假,但是当一大堆消息组合起来,将军就不知道了,所以将军就找到了你. 提供两种组合方式: A&B:代表A和B都为真的时候,A和B组合起

中缀表达式转成后缀表达式

参考 数据结构Java实现06----中缀表达式转换为后缀表达式 将中缀表达式转化为后缀表达式 Mycode 1 package collection_Exe; 2 3 import java.util.*; 4 5 public class Exe16 { 6 public static void main(String[] args) { 7 Scanner input = new Scanner(System.in); 8 System.out.println("Input :"

表达式求值(中缀式转后缀式,后缀式求值)NYOJ53测试通过

测试地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=35 package calc; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Scanner; public class Main { //操作符栈 static LinkedList<String>