- 參考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的功能計算後綴表達式的值,把結果發送給客戶端
- 客戶端顯示服務器發送過來的結果