1. 程式人生 > >字尾表示式 詳解

字尾表示式 詳解

表示式的表示形式有中綴、字首和字尾3中形式。中綴表示式按操作符的優先順序進行計算(後面程式碼實現只包括+、-、*、\,小括號),即數學運算。 字尾表示式中只有運算元和操作符。操作符在兩個運算元之後。它的計算規則非常簡單,嚴格按照從左到右的次序依次執行每一個操作。每遇到一個操作符,就將前面的兩個數執行相應的操作。 

由字尾表示式計算中綴表示式原理:計算機處理字尾表示式求值問題是比較方便的,即將遇到的運算元暫存於一個運算元棧中,凡是遇到運算元,便從棧中pop出兩個運算元,並將結果存於運算元棧中,直到對字尾表示式中最後一個運算元處理完,最後壓入棧中的數就是後最表示式的計算結果。 

中綴表示式轉換為等價的字尾表示式 

中綴表示式不方便與計算機處理,通常要講中綴表示式轉換為一個與之等價的字尾表示式。等價是指兩個表示式的計算順序和計算結果完全相同。 

中綴表示式:0.3/(5*2+1)# 

的等價字尾表示式是:0.3 5 2 * 1 + /# 

仔細觀察這兩個等價的表示式可知,運算元的出現次序是相同的,但運算子的出現次序是不同的。在後綴表示式中,運算子的出現次序是實際進行操作的次序;在中追表示式中,由於受到操作符的優先順序和括號的影響,操作符出現次序與實際進行操作的次序很可能是不一樣的。 

演算法描述: 

將中綴表示式轉換為等價的字尾表示式的過程要使用一個棧放“(”,具體可以按照下面的方式進行。 

(1)從左到右依次掃描中綴表示式的每一個字元,如果是數字字元和圓點“.”則直接將它們寫入字尾表示式中。 

(2)如果遇到的是開括號“(”,則將它們壓入一個操作符棧(不需要與棧頂操作符相比較),它表明一個新的計算層次的開始,在遇到和它匹配的閉括號“)”時,將棧中的元素彈出來並放入字尾表示式中,直到棧頂元素為“(”時,將棧頂元素“(”彈出(不需要加入字尾表示式),表明這一層括號內的操作處理完畢。 

(3)如果遇到的是操作符,則將該操作符和操作符棧頂元素比較: 

    1、當所遇到的操作符的優先順序小於或等於棧頂元素的優先順序時,則取 出棧頂元素放入字尾表示式,並彈出該棧頂元素,反覆執行直到當前操作符的優先順序大於棧頂元素的優先順序小於;

     2、當所遇到的操作符的優先順序大於棧頂元素的優先順序的時則將它壓入棧中。 

(4)重複上述步驟直到遇到中綴表示式的結束符標記“#”,彈出棧中的所有元素並放入字尾表示式中,轉換結束

程式碼如下:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<string>
  5. #include<vector>
  6. #include<stack>
  7. #include<algorithm>
  8. usingnamespace std;  
  9. int
     pre(char a) //操作符優先順序比較
  10. {  
  11.     if(a == '=' || a == '(')  
  12.         return 0;  
  13.     elseif(a == '+' || a == '-')  
  14.         return 1;  
  15.     elseif(a == '*' || a == '/')  
  16.         return 2;  
  17. }  
  18. int main()  
  19. {  
  20.     int ncase, len;  
  21.     string str;  
  22.     char tmp;  
  23.     stack<char> ope; //操作符
  24.     vector<char
    > ans;//字尾表示式
  25.     vector<char>::iterator start, end;  
  26.     scanf("%d", &ncase);  
  27.     getchar(); //清除輸入垃圾
  28.     while(ncase--)  
  29.     {  
  30.         while(!ope.empty()) //初始化
  31.             ope.pop();  
  32.         ans.clear();  
  33.         ope.push('='); //結束標誌
  34.         cin>>str;  
  35.         len = str.length();  
  36.         for(int i = 0 ; i < len; ++i)  
  37.         {  
  38.             if(str[i] >= '0' && str[i] <= '9'//運算元直接存入ans
  39.                 ans.push_back(str[i]);  
  40.             elseif(str[i] == '('//左括號入棧
  41.                 ope.push(str[i]);  
  42.             elseif(str[i] == ')'//右括號,將匹配的左括號內容存入ans,左括號出棧
  43.             {  
  44.                 while (ope.top() != '(')  
  45.                 {  
  46.                     ans.push_back(ope.top());  
  47.                     ope.pop();  
  48.                 }  
  49.                 ope.pop(); //左括號出棧
  50.             }  
  51.             elseif(pre(str[i]) > pre(ope.top())) //優先順序大於棧頂元素則入棧
  52.                 ope.push(str[i]);  
  53.             else//小於棧頂元素
  54.             {  
  55.                 while(pre(str[i]) <= pre(ope.top()))  
  56.                 {  
  57.                     ans.push_back(ope.top());  
  58.                     ope.pop();  
  59.                 }  
  60.                 ope.push(str[i]);  
  61.             }         
  62.         }  
  63.         while(ope.top() != '='//其餘操作符存入字尾表示式中
  64.         {  
  65.             ans.push_back(ope.top());  
  66.             ope.pop();  
  67.         }  
  68.         for(start = ans.begin(), end = ans.end(); start < end; ++start)  
  69.             printf("%c", *start);  
  70.         printf("\n");  
  71.     }  
  72.     return 0;  
  73. }  

相關推薦

ZOJ3829 (字尾表示式),適合新手

題目放在最後面: 我想說,這個題對於不知道字尾表示式的人真的坑,看了半天題目結果還迷迷糊糊,但是這個卻是銅牌的題目,哎。 非常建議看一看相關部落格,關於他們的定義,推薦一篇寫的很好的部落格: 看完之後,解這個題就是分分鐘的事了,對於一個字尾表示式,我們的求法

字尾表示式

表示式的表示形式有中綴、字首和字尾3中形式。中綴表示式按操作符的優先順序進行計算(後面程式碼實現只包括+、-、*、\,小括號),即數學運算。 字尾表示式中只有運算元和操作符。操作符在兩個運算元之後。它的計算規則非常簡單,嚴格按照從左到右的次序依次執行每一個操作。每遇到一個操

Jsp的指令碼、宣告、表示式

jsp指令碼 在<%%>中包含可執行的Java程式碼 <% Java程式碼 %> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding

php 中正則表示式

概述 正則表示式是一種描述字串結果的語法規則,是一個特定的格式化模式,可以匹配、替換、擷取匹配的字串。常用的語言基本上都有正則表示式,如JavaScript、java等。其實,只有瞭解一種語言的正則使用,其他語言的正則使用起來,就相對簡單些。文字主要圍繞解決下面問題展開。 有哪些常用的

Cron表示式表示式的驗證

本篇不算原創,因為主要內容來自網上的部落格,所以給出我參考文章的連結。 本文cron表示式詳解的大部分內容參考了[cron表示式詳解]和Quartz使用總結、Cron表示式 這兩篇文章。 cron校驗的內容參考了 判斷cron表示式輸入是否有效的正則表示式 和Verifying a cron expres

正則表示式(貪婪與懶惰、前瞻與後顧、後向引用等)

之前嫌正則麻煩,一直沒有深入去了解過正則,能不用的地方就不使用。 最近專案中遇到了不可避免的正則使用,所以花了點時間去了解並整理了一下,理解不一定完全準確,如有不對歡迎指出,希望對大家有所幫助。 一、名詞解釋 首先我們瞭解幾個名詞:元字元 、 普通字元、列印字元、非列印字元、 限定符 、定位符、非列

Spring排程器corn表示式

NAME crontab -- tables for driving cron DESCRIPTION A crontab file contains instructions to the cron(8) daemon of the general

Django中聚合函式,F表示式和Q表示式

學習聚合函式的準備工作 新建一個專案,在新建一個app,名字隨意,然後在app中的models中定義幾個模型: from django.db import models # Create your models here. class Author(models.Model):

正則表示式及實戰

Create by jsliang on 2018-11-14 10:41:20 Recently revised in 2018-11-19 09:04:18  Hello 小夥伴們,如果覺得本文還不錯,記得給個 star,你們的 star 是我學習的動力!GitHub 地址  正則表

linux ${}表示式

表示式替換 1、${var_name}等價於$var_name(通常用這種簡寫方式) 2、$(var:-default) 和$(var-default) $(var:-default) 當var為空或未定義時整個

Cron表示式(job表示式)

Cron表示式的詳細用法 欄位 允許值 允許的特殊字元  秒 0-59 , - * /  分 0-59 , - * /  小時 0-23 , - * /  日期 1-31 , - * ? / L W C  月份 1-12 或者 JAN-DEC , - * /  星期 1-7

python正則表示式(二):特殊字元序列

內容提要: 說明:僅供學習交流使用 二、python正則表示式中的特殊字元序列 \number   \A  \Z   \b    \B    \d  \D   \s  \S  \w   \W      \\ 2.1\number  以相同的序號代表的組所匹配的內容

C語言正則表示式

標準的C和C++都不支援正則表示式,但有一些函式庫可以輔助C/C++程式設計師完成這一功能,其中最著名的當數Philip Hazel的Perl-Compatible Regular Expression庫,許多Linux發行版本都帶有這個函式庫。   C語言處理正則表示式常用的函

正則表示式

一、校驗數字的表示式   1 數字:^[0-9]*$   2 n位的數字:^\d{n}$   3 至少n位的數字:^\d{n,}$   4 m-n位的數字:^\d{m,n}$   5 零和非零開頭的數字:^(0|[1-9][0-9]*)$   6 非零開頭的最多帶

三元表示式

三元表示式 test ? expression1 : expression2 引數 test 任何 Boolean 表示式。 expression1 如果 test 為 true,則返回表示式。可能是逗號表示式。 expression2 如果 test 為 fa

正則表示式/大全

正則表示式 前端往往有大量的資料效驗工作,可以通過正則表示式提高工作效率。 修飾符: i 不區分大小寫 g 全域性查詢 m 多行查詢 方法: test() 根據正則表示式規範判斷某個字串是否符合該正則規範,返回一個布林值 用法:reg.test(str

SQL---模糊查詢與正則表示式和對比

1:模糊查詢 在進行資料庫查詢的時候,有完整查詢和模糊查詢之分; 完整查詢就是我們平時查詢的普通語句(對某個查詢條件確定的前提下),而模糊查詢就是常見的where 後面增加了 like 關鍵字。 一般模糊查詢語句如下: select 欄位 from 表 where 某欄位 l

Cron表示式

1.cron表示式格式: {秒數} {分鐘} {小時} {日期} {月份} {星期} {年份(可為空)} 2.cron表示式各佔位符解釋: {秒數} ==> 允許值範圍: 0~59 ,不允許為空值,若值不合法,排程器將丟擲SchedulerException異常

AspectJ的切入點表示式---execution表示式

Aspectj切入點語法定義 在使用spring框架配置AOP的時候,不管是通過XML配置檔案還是註解的方式都需要定義pointcut”切入點” 例如定義切入點表示式 execution (* com.sample.service.impl..*. *(..)) execution()是

js 正則表示式

開篇,還是得說說 ^ 和 $ 他們是分別用來匹配字串的開始和結束,以下分別舉例說明 "^The": 開頭一定要有"The"字串; "of despair$": 結尾一定要有"of despair" 的字串; 那麼,