表达式求值--栈

  用栈的方式,将中缀转为后缀,再进行求值。另外附加括号匹配的方法

  1 public class PostfixExpression {
  2
  3     public static int lastvalue(String str){    //后缀表达式求值,传入空格分割的字符串
  4         Stack<Integer> stack = new Stack<Integer>();
  5         String[] data = str.split(" ");
  6
  7         for(int i = 0;i < data.length;i++){
  8             if(data[i].charAt(0) >= ‘0‘ && data[i].charAt(0) <= ‘9‘){
  9                 //将data[i]转换为int数据
 10                 int m =  Integer.parseInt(data[i]);
 11                 stack.push(m);
 12             }else{
 13                 int a = stack.pop();
 14                 int b = stack.pop();
 15                 //构造b ? a计算结果,,将结果入栈
 16                 switch(data[i].charAt(0)){
 17                     case ‘+‘:stack.push(b+a);break;
 18                     case ‘-‘:stack.push(b-a);break;
 19                     case ‘*‘:stack.push(b*a);break;
 20                     case ‘/‘:stack.push(b/a);break;
 21                     case ‘%‘:stack.push(b%a);break;
 22                 }
 23             }
 24 //            System.out.println("---list:"+stack);
 25         }
 26         return stack.peek();
 27     }
 28     public static String turnvalue(String s){    //中缀变换后缀
 29         Stack<String> stack = new Stack<String>();
 30         StringBuffer sb = new StringBuffer();
 31         int i = 0;
 32         while(i < s.length()){
 33             char c = s.charAt(i);
 34             switch(c){
 35                 case ‘+‘:case ‘-‘:
 36                     while(!stack.isEmpty() && !stack.peek().equals("("))
 37                         sb.append(stack.pop()+" ");
 38                     stack.push(c + "");i++;
 39                     break;
 40                 case ‘*‘:case ‘/‘:
 41                     while(!stack.isEmpty() && (stack.peek().equals("*") || stack.peek().equals("/")))
 42                         sb.append(stack.pop()+" ");
 43                     stack.push(c + "");i++;
 44                     break;
 45                 case ‘(‘:
 46                     stack.push(c + "");i++;
 47                     break;
 48                 case ‘)‘:
 49                     while(stack.peek() != null && !stack.peek().equals("("))
 50                         sb.append(stack.pop() + " ");
 51                     stack.pop();
 52                     i++;break;
 53                 default:
 54                     if(c == ‘;‘){
 55                         i++;
 56                         break;
 57                     }
 58                     while(i < s.length() && c >=‘0‘ && c <= ‘9‘){
 59                         sb.append(c);i++;
 60                         if(i < s.length())
 61                             c = s.charAt(i);
 62                     }
 63                     sb.append(" ");
 64             }
 65         }
 66         while(!stack.isEmpty())
 67             sb.append(stack.pop()+" ");
 68 //        System.out.println(sb);
 69
 70         return sb.toString();
 71     }
 72     public static String match(String str) {    //计算括号匹配
 73         int x = 0; // 花括号的个数
 74         int y = 0; // 方括号的个数
 75         int z = 0; // 弧括号的个数
 76         int k = 0; // 尖括号的个数
 77         boolean isMatch = true; // 是否匹配
 78         Stack<Character> stack = new Stack<Character>();
 79
 80         if( str.charAt(0) == ‘)‘)
 81             isMatch = false;
 82         for (int i = 0; i < str.length(); i++) {
 83             char ch = str.charAt(i);
 84             stack.push(ch);
 85             if (ch == ‘}‘) {
 86                 x++;
 87                 while(isMatch){
 88                     if (stack.isEmpty()){
 89                         isMatch = false;
 90                         break;
 91                     }
 92                     if(stack.pop() == ‘{‘)
 93                         break;
 94                 }
 95             }
 96             if (ch == ‘]‘) {
 97                 y++;
 98                 while(isMatch){
 99                     if (stack.isEmpty()){
100                         isMatch = false;
101                         break;
102                     }
103                     if(stack.pop() == ‘[‘)
104                         break;
105                 }
106             }
107             if (ch == ‘)‘) {
108                 z++;
109                 while(isMatch){
110                     if (stack.isEmpty()){
111                         isMatch = false;
112                         break;
113                     }
114                     if(stack.pop() == ‘(‘)
115                         break;
116                 }
117             }
118             if (ch == ‘>‘) {
119                 k++;
120                 while(isMatch){
121                     if (stack.isEmpty()){
122                         isMatch = false;
123                         break;
124                     }
125                     if(stack.pop() == ‘<‘)
126                         break;
127                 }
128             }
129         }
130 //        System.out.println("list:"+stack);
131         if(!stack.isEmpty())
132             isMatch = false;
133
134         StringBuffer sb = new StringBuffer();
135         if (isMatch)
136             sb.append("配对。共有"+ x +"对{}、"+ y +"对[]、"+ z +"对()、"+ k +"对<>。");
137         else
138             sb.append("不配对。");
139
140         return sb.toString();
141     }
142 }

原文地址:https://www.cnblogs.com/AardWolf/p/10056411.html

时间: 2024-11-05 23:31:25

表达式求值--栈的相关文章

表达式求值 (栈) 用C++实现

1 #include <cstdio> 2 3 #include <cstdlib> 4 5 #include <cmath> 6 7 #include <stack> 8 9 #include <cstring> 10 11 using namespace std; 12 13 14 15 char Precede(char a, char b) { //判断运算符优先级 16 17 int i, j; 18 19 char Table[8][

Python解析 算数表达式求值 栈的使用

使用Python实现一种算数表达式求值的算法,模拟这种使用栈的方式,这是由E.W.Dijkstra在20世纪60年代发明的一种非常简单的算法.代码模拟仅仅表现一种编程思想,代码的逻辑并不完全: if __name__ == "__main__": cal_str = input("请输入算数表达式(e.g.(((1+2)*(3+5))+2), 只适合简单的算数表达式):") num_stack = [] symbol_stack = [] for chr in ca

hdu1237 表达式求值--栈

简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 24273    Accepted Submission(s): 8794 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整

数据结构(7)----栈与队列之栈的应用四则运算表达式求值

栈与队列之栈的应用四则运算表达式求值 栈在四则运算表达式求值的应用为逆波兰表达式(后缀表达式) 普通算式(中缀表达式):9 + (3 - 1) * 3 + 10 / 2     ---(1) 逆波兰表达式(后缀表达式):9 3 1 - 3 * + 10 2 /         ---(2) 1:逆波兰表达式的计算规则 从左到右遍历表达式的每个数字和符号,遇到数字就进栈,遇到符号,就将处于栈顶的两个数字出栈,进行运算,再把运算结果进栈,一直到最终获得结果.接下来我们以(2)式为例:

中缀表达式求后缀,再由后缀表达式求值

人:中缀表达式 计算机:后缀表达式 需要进行中缀转后缀,再计算.无论哪一步都需栈: 对于(3 + 4) × 5 - 6 一 中缀转后缀 涉及的栈用来存储符号如"+ - × / ( )" 思想: 遇见数字输出:遇见符号入栈 当空栈或者符号是左括号时直接入栈 ; 当是运算符时将要入栈的符号需要大于栈内符号否在现将栈内比该运算符大或者等的出栈输出,然后再入栈; 当运算符是右括号时,将栈内直到第一个左括号的符号出栈,并输出非括号的符号 算法: //中缀表达式改成后缀表达式 void mid2a

数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚,所以很多需要自己揣摩.这也体现了算法和程序设计语言的特点,算法更侧重本质的描述,而任何编程语言都要照顾到实现的细节以及数据类型等语法方面的需求. 表达式求值: [编码中....] 二.头文件 迷宫求解: 1 //3_2_maze.h 2 /** 3 author:zhaoyu 4 email:[em

栈的两个应用:括号匹配的检验和表达式求值

1.     括号匹配的检验 假设表达式中含有3种括号:(),[],{},其嵌套的顺序随意.检验括号是否匹配. 基本思想:在算法中设置一个栈,每读入一个括号,若是右括号,则或者与栈顶匹配的左括号相互消解,或者是不合法的情况:若是左括号,则直接压入栈中.若括号匹配,在算法的开始和结束时,栈都应该是空的. 代码: /* * 判断表达式中的括号是否匹配,匹配输出Yes,否则输出No * {(zhang)+[lei]+{lei}={zhangleilei}} -> Yes * {(zhang)+[lei

NYOJ35 表达式求值 【栈】

表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧. 比如输入:"1+2/4=",程序就输出1.50(结果保留两位小数) 输入 第一行输入一个整数n,共有n组测试数据(n<10). 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以"

栈的应用—算术表达式求值

例三.算术表达式求值 1.问题描述 当一个算术表达式中含有多个运算符,且运算符的优先级不同的情况下,如何才能处理一个算术表达式????? 2.思路 首先我们要知道表达式分为三类:  ①中缀表达式:a+(b-c/d)*e ②前缀表达式+a*-be ③后缀表达式abcd/-e*+ 由于运算符有优先级,所以在计算机中计算一个中缀的表达式非常困难,特别是带括号的更麻烦,而后缀表达式中既无运算符优先又无括号的约束问题因为在后缀表达式中运算符出现的顺序正是计算的顺序,所以计算一个后缀的表达式更简单.所以,可