- 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA
- 结对实现中缀表达式转后缀表达式的功能 MyBC.java
- 结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC.java
Stack 类表示后进先出(LIFO)的对象堆栈。它经过五个操做对类 Vector 进行了扩展 ,容许将向量视为堆栈。它提供了一般的 push 和 pop 操做,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并肯定到堆栈顶距离的 search 方法。java
伪代码git
代码清单算法
import java.util.StringTokenizer; import java.util.Stack; public class MyDC { /** * constant for addition symbol */ private final char ADD = '+'; /** * constant for subtraction symbol */ private final char SUBTRACT = '-'; /** * constant for multiplication symbol */ private final char MULTIPLY = '*'; /** * constant for division symbol */ private final char DIVIDE = '/'; /** * the stackA */ private Stack<Integer> stack; public MyDC() { stack = new Stack<Integer>(); } public int evaluate(String expr) { int op1, op2, result = 0; String token; StringTokenizer tokenizer = new StringTokenizer(expr); while (tokenizer.hasMoreTokens()) { token = tokenizer.nextToken(); //若是是运算符,调用isOperator if (isOperator(token)) { op2=stack.pop(); op1=stack.pop(); result=evalSingleOp(token.charAt(0),op1,op2); //根据运算符和两个操做数调用evalSingleOp计算result; //计算result入栈; stack.push(result); } else {//若是是操做数 stack.push(Integer.parseInt(token));//操做数入栈; } } return result; } private boolean isOperator(String token) { return (token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/")); } private int evalSingleOp(char operation, int op1, int op2) { int result = 0; switch (operation) { case ADD: result = op1 + op2; break; case SUBTRACT: result = op1 - op2; break; case MULTIPLY: result = op1 * op2; break; case DIVIDE: result = op1 / op2; } return result; } }
伪代码express
代码清单编程
import java.util.*; public class MyBC { public String result(String s) { Stack<String> sta = new Stack<String>(); //新建栈 String str = ""; StringTokenizer t=new StringTokenizer(s); while (t.hasMoreTokens()){ //依次遍历元素,转为后缀表达式 String temp; String c; c=t.nextToken(); if (c.equals("+") || c.equals("-")) { //遇到优先级最低的“+”、“-”,弹出“(”以前的全部元素 while (sta.size() != 0) { temp = sta.pop(); if (temp.equals("(")) { sta.push("("); break; } str = str + temp + " "; } sta.push(c); } else if (c.equals("*")|| c.equals("÷")) { //遇到优先级高的“*”、“/”,弹出“(”以前的“*”、“/” while (sta.size() != 0) { temp = sta.pop(); if (temp.equals("(") || temp.equals("+") || temp.equals("-")) { sta.push(temp); break; } else str = str + temp + " "; } sta.push(c); } else if (c.equals("(")) { //遇到“(”直接入栈 sta.push(c); } else if (c.equals(")")) { //遇到“)”,弹出“(”以前的全部元素 while (sta.size() != 0) { temp = sta.pop(); if (temp.equals("(")) break; else str = str + temp + " "; } } else //遇到数字,直接存入数组 str = str + c + " "; } while (sta.size()!=0){ //弹出栈中剩余的元素 str=str+sta.pop()+" "; } return str; } }
测试代码数组
import java.util.Scanner; public class Test { public static void main(String[] args) { String s; int result; try { System.out.println("Enter a valid postfix expression: "); MyDC dc = new MyDC(); MyBC bc = new MyBC(); Scanner in = new Scanner(System.in); s = in.nextLine(); s = bc.result(s); result = dc.evaluate(s); System.out.println("That expression equals : " + result); } catch (Exception IOException) { System.out.println("Input exception reported"); } } }
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,而后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式经过网络发送给服务器
- 服务器接收到后缀表达式,调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
2.运行截图
安全
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,而后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后经过网络把密文发送给服务器
- 服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,能够用数组保存),而后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,而后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密经过网络把密文发送给服务器
- 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
- 服务器接收到后缀表达式表达式后,进行解密,而后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,而后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密经过网络把密文和明文的MD5値发送给服务器
- 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
- 服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果