Java實現----中綴表達式轉成尾碼表達式

来源:http://www.cnblogs.com/zuosy/archive/2017/08/14/7357038.html
-Advertisement-
Play Games

參考 數據結構Java實現06 中綴表達式轉換為尾碼表達式 將中綴表達式轉化為尾碼表達式 Mycode 你以為我會寫註釋嗎?不可能的。 運行結果如下: 像我這種不拘小節的男人,是不會在意同優先順序運算順序的。 大概上,演算法是沒什麼錯誤的。 再附上一個程式,同樣不會寫註釋的。 自己憑本事寫的bug。 ...


參考

數據結構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 :");
 9         String string = input.nextLine();
10         input.close();
11         String[] strs = string.split(" ");
12         Set<String> set = new HashSet<>();
13         set.add("+");
14         set.add("-");
15         set.add("*");
16         set.add("/");
17         set.add("(");
18         set.add(")");
19         Stack<String> stack = new Stack<>();
20         Stack<String> operator = new Stack<>();
21         for(String str : strs) {
22             if(!set.contains(str)) {
23                 stack.push(str);
24             } else {
25                 switch (str) {
26                 case "+":
27                 case "-":
28                     if(!operator.isEmpty() && 
29                        !operator.peek().equals("(")) {
30                         stack.push(operator.pop());
31                     }
32                     operator.push(str);
33                     break;
34                 case "*":
35                 case "/":
36                     if(!operator.isEmpty() &&
37                        (operator.peek().equals("*") || 
38                          operator.peek().equals("/"))) {
39                         stack.push(operator.pop());
40                     }
41                     operator.push(str);
42                     break;
43                 case "(":
44                     operator.push(str);
45                     break;
46                 case ")":
47                     while (!operator.peek().equals("(")) {
48                         stack.push(operator.pop());
49                     }
50                     operator.pop();
51                     break;
52                 default:
53                     System.out.println("Error");
54                     break;
55                 }
56             }
57         }
58         while(!operator.isEmpty()) {
59             stack.push(operator.pop());
60         }
61         System.out.println(stack.toString());
62     }
63 }

你以為我會寫註釋嗎?不可能的。

運行結果如下:

像我這種不拘小節的男人,是不會在意同優先順序運算順序的。

大概上,演算法是沒什麼錯誤的。


 再附上一個程式,同樣不會寫註釋的。

 1 package collection_Exe;
 2 
 3 import java.util.HashSet;
 4 import java.util.Scanner;
 5 import java.util.Set;
 6 import java.util.Stack;
 7 
 8 public class Exe14 {
 9     public static void main(String[] args) {
10         Scanner input = new Scanner(System.in);
11         System.out.println("Input:");
12         String str = input.nextLine();
13         input.close();
14         String[] strs = proStr(str);
15         Stack<Integer> stack = new Stack<>();
16         Set<String> set = new HashSet<>();
17         set.add("+");
18         set.add("-");
19         set.add("*");
20         set.add("/");
21         for(String s : strs) {
22             if(set.contains(s)) {
23                 processStack(stack, s.charAt(0));
24             } else {
25                 stack.push(Integer.parseInt(s));
26             }
27         }
28         System.out.println("Result : " + stack.pop());
29     }
30     
31     public static void processStack(Stack<Integer> stack, Character op) {
32         Integer num2 = stack.pop();
33         Integer num1 = stack.pop();
34         Integer num3 = null;
35         switch (op) {
36         case '+':
37             num3 = num1 + num2;
38             break;
39         case '-':
40             num3 = num1 - num2;
41             break;
42         case '*':
43             num3 = num1 * num2;
44             break;
45         case '/':
46             num3 = num1 / num2;
47             break;
48         default:
49             System.out.println("ERROR IN processStack.");
50             break;
51         }
52         stack.push(num3);
53     }
54     
55     public static String[] proStr(String str) {
56         return str.split(" ");
57     }
58 }

自己憑本事寫的bug。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • //使用Sort方法,可以對集合中的元素進行排序。Sort有三種重載方法,聲明代碼如下所//示。 public void Sort(); //使用集合元素的比較方式進行排序 public void Sort(IComparer comparer); //使用自定義比較器進行排序 public voi... ...
  • Owin Middleware Components(OMCs) 通過安裝Install-Package Microsoft.Owin.Host.SystemWeb 可以讓OMCs在IIS集成管道下工作 在IIS集成管道里,這個request pipeline 包含HttpModules關聯到一組預 ...
  • 諸如 SAP 這樣的企業級應用已成為普遍的流行趨勢。考慮到不同行業和需求的特點,所選平臺必須能夠為不同層面用戶和各種 IT 活動提供靈活的容量需求。 此時上雲也許是種不錯的選擇,而想上雲的企業,一方面希望自己的實施是高效率、低投入的;另一方面,又想把風險降低到最小程度。針對不同的客戶需求,SAP 提... ...
  • Katana在程式集內的程式集名稱空間下查找一個叫做Startup的類, 定義友好命名的Startup類 https://docs.microsoft.com/en-us/aspnet/aspnet/overview/owin-and-katana/owin-startup-class-detect ...
  • PsPing 是微軟 PSTools 工具套件中的其中一個工具,除了用來進行 ICMP Ping 測試,還可用來測試 TCP 埠的連通性,以及 TCP/UDP 網路時延和帶寬。 ...
  • 機器學習是一項已被研究及應用了數十年的專業領域,是一個能基於數據輸入,進而導出預測成果的繁複電腦系統流程。而 Azure 的機器學習,則封裝了這多年來機器學習的研究成果(如在 Bing 和 Xbox Live 已被使用的),能夠以簡潔的方法進行大數據分析時所需要的複雜數學模型,同時還大幅降低了進行... ...
  • 本文通過實例講解Java中如何使用ArrayList類。 Java.util.ArrayList類是一個動態數組類型,也就是說,ArrayList對象既有數組的特征,也有鏈表的特征。可以隨時從鏈表中添加或刪除一個元素。ArrayList實現了List介面。 大家知道,數組是靜態的,數組被初始化之後, ...
  • 一、概念: 一般我們都知道ArrayList* 由一個數組後推得到的 List。作為一個常規用途的對象容器使用,用於替換原先的 Vector。允許我們快速訪問元素,但在從列表中部插入和刪除元素時,速度卻嫌稍慢。一般只應該用ListIterator 對一個 ArrayList 進行向前和向後遍歷,不要 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...