日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关系表达式的计算

發布時間:2024/7/19 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关系表达式的计算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

近期在做一個項目,涉及到一些簡單的規則匹配。規則的判定條件可以用關系表達式描述,形如(P1|P2)&(P3|P4)。其中&是與,|是或,P1-P4是Pattern,具體的匹配條件,返回值是True或者False。為計算此表達式的值,采用中序轉后序再計算表達式的值。

1. 后序表達式的生成

中序表達式轉后序表達式算法:

1. 用&|()對原表達式進行拆分,得到List<String>。
2. 從前往后遍歷該List:
? ? (1)如果是一個pattern,則入棧。
? ??(2)如果是左括號(,也入棧。
? ??(3)如果是右括號:
? ??? ??(a)如果此時棧為空,則表示表達式解析異常,報警并退出。
? ??? ??(b)如果棧不為空,則依次pop棧頂元素,直到匹配到左括號(。如果沒有左括號(的匹配,則表達式依次,報警并退出。
? ??(4)如果是&和|:
? ??? ??(a)如果棧為空,直接入棧。
? ??? ??(b)如果棧不為空,依次出棧直到匹配左括號(左括號不出棧)。再把操作符入棧。
3、所有的pattern和操作符都入棧以后,把棧中所有元素依次出棧,就得到后序表達式。

參考代碼:

List<String> postfix = new ArrayList<String>(); Stack<String> stack = new Stack<String>(); String delims = "&|()"; // 支持的操作符 StringTokenizer st = new StringTokenizer(rule, delims, true); while (st.hasMoreTokens()) {String tk = st.nextToken();if (!delims.contains(tk)) {// pattern,直接入棧 postfix.add(tk);} else if (tk.equals("(")) {// 左括號,入棧 stack.push(tk);} else if (tk.equals(")")) {if (stack.empty()) {// 碰到右括號,如果棧為空,解析異常throw new RuleException("parseRule Error!");}String val = stack.pop();// 如果棧不為空,依次出棧直到匹配左括號while (!val.equals("(")) {postfix.add(val);if (!stack.empty()) {val = stack.pop();} elsebreak;}if (stack.empty() && !val.equals("(")) {// 如果匹配不到左括號,解析異常throw new RuleException("parseRule Error!");}} else if (tk.equals("&") || tk.equals("|")) {if (stack.empty()) {// 碰到操作符,如果棧空,則直接入棧 stack.push(tk);} else {// 如果棧不為空,依次出棧直到匹配左括號while (!stack.empty() && !stack.lastElement().equals("(")) {postfix.add(stack.pop());}// 操作符入棧 stack.push(tk);}} }// 所有的pattern和操作符匹配完畢,把堆棧中還有的數據依次出棧 while (!stack.empty()) {postfix.add(stack.pop()); }System.out.println("Original Rule:" + rule); System.out.println("Postfix Rule: " + postfix.toString());

?

2. 后序表達式的計算

后序表達式的計算算法:

1. 從前往后遍歷中序表達式:
? ??(1)如果是&|操作符,則pop兩個字段r1和r2,計算r1&r2或r1|r2的值r3,并將r3入棧。
? ??(2)如果是pattern,則計算pattern的匹配結果True Or False,并將結果入棧。
2、中序表達式便利完畢,棧中只有1個元素,即為表達式結果。

?參考代碼:

Stack<Boolean> stack = new Stack<Boolean>(); for (String str : this.postfix) {if (str.equals("&")) {// pop兩個pattern,計算boolean r1 = stack.pop();boolean r2 = stack.pop();stack.push(r1 && r2);} else if (str.equals("|")) {// pop兩個pattern,計算boolean r1 = stack.pop();boolean r2 = stack.pop();stack.push(r1 || r2);} else {// 計算pattern的值,并push到stackPattern ptn = this.patterns.get(str);stack.push(ptn.judge(fact));} }if (stack.size() == 1) {return stack.pop(); } else {throw new RuleException("judge failed: postfix error!"); }

?

轉載于:https://www.cnblogs.com/simplestupid/p/4771892.html

總結

以上是生活随笔為你收集整理的关系表达式的计算的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。