數學雜談 如何將中綴表示式轉換成字尾表示式

2021-09-25 13:06:21 字數 2890 閱讀 9810

怎麼轉換

數學雜談這個東西。。。我好像已經很久沒有更新了吧。。。qwq

當然,今天作為某道題的基礎,這當然是必不可少的了。

乙個式子能分成三種:字首表示式,中綴表示式,字尾表示式。

正如其名,字首表示式就是所有的符號都在前面;中綴表示式呢,就是我們平時用到的式子了;字尾表示式就是所有的運算子都在後面。

一般來說,計算機用到的都是字首表示式和字尾表示式(反正不會是中綴就行了)

話說好奇怪啊,人類發明的東西,竟然不是按照人類的思維來做??

當然字首和字尾有個好處,他們的式子中不可能會有括號存在。因為在這兩個表示式中,在中綴優先的,這裡也能優先,並且不需要括號來限制。

當然,這樣說著很抽象,看個式子: 4∗5

+4∗(

6+7∗

(2+3

−5))

∗5

4 * 5 + 4 * (6 + 7 * (2 + 3 - 5)) * 5

4∗5+4∗

(6+7

∗(2+

3−5)

)∗5,轉換成字尾是這樣的:45∗

4672

3+5−

∗+∗5

∗+

4 \ 5 * 4\ 6\ 7\ 2\ 3 + 5 - * + *\ 5 * +

45∗467

23+5

−∗+∗

5∗+,字首就先放一邊吧,今天主要是研究中綴轉字尾。。。其實是我太蒟了 (逃

字尾表示式的機制呢就是碰到乙個運算子後,在找他前面遇到的第1、2

1、 2

1、2個數字,將其進行運算,然後再找下乙個,直到表示式算完。

#include

#include

#include

using

namespace std;

stack<

int> a;

char s[10]

;int x,y,z;

intmain()

else

} x=a.

top();

printf

("%d"

,x);

}

差不多就是這樣,看得懂思路就行(我都覺得寫得很稚嫩),畢竟是一年前寫得嘛

這才是最重要的說

前面已經說了字尾表示式計算的機制了,那麼接下來就來講講具體轉換的步驟:

1. 如果說遇到的是數字的話,那麼就可以直接輸出,判斷下乙個

2. 如果說遇到的是左括號的話,先存進去等遇到右括號後再處理

3. 如果說遇到的是運算子的話,那麼先存進棧,等碰到下乙個運算子時在判斷優先順序的大小左括號的優先順序最低,加減次之,乘除最高(此處不考慮冪)。如果說棧裡的那個運算子比當前這個運算子大的話,就說明可以優先輸出棧裡的了,用while迴圈判斷,如果說棧裡的優先順序大於等於該運算子的話,就一直輸出,否則將該運算子入棧

4. 如果說遇到的右括號的話,就說明這個括號裡的運算操作都已經做完了,可以直接一股腦的將棧裡左括號之後的輸出就okok

ok了。5. 如果說這個串讀完了,而棧裡還有的話,也就直接輸出就可以了。還有乙個注意是所有的括號均不輸出。

當然,如果還沒太懂得可以看看(康康

)這篇部落格 和這篇也行

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

#define reg register

#define ll long long

#define inf 0x3f3f3f3f

template

<

typename t>

void re (t &x)

while

(c >=

'0'&& c <=

'9')

x *= f;

}template

<

typename t>

void pr (t x)

if(x /

10) pr (x /10)

; putchar (x %10+

48);}

string a, b;

int lena;

stack<

char

> s;

int cmp (

char s)

void transfer (string a)

else

if(a[i]

=='x'

)else

if(a[i]

=='('

) s.push (a[i]);

else

if(a[i]

=='+'

|| a[i]

=='-'

|| a[i]

=='*'

)int lev1 = cmp (a[i]

), lev2 = cmp (s.top ())

;if(lev1 > lev2) s.push (a[i]);

else

s.push (a[i]);

}}else

s.pop ();

}}while

(!s.empty ())

}int main (

)

將中綴表示式轉換成字尾表示式

我們人腦很容易理解中綴表示式,但是中綴表示式在計算機並不好計算,所有我們要將中綴表示式轉換成字尾表示式,因為字尾表示式是很容易計算的。為什麼要寫乙個這樣的程式呢?原因是我一開始想寫乙個計算機,它能夠將輸入的表示式的值計算出來。一開始覺得這樣子的程式應該是很簡單的,然後開始動手寫,開始寫了之後才發現並...

中綴表示式轉換成字尾表示式

一 基礎知識 中綴表示式 人們常用的表示式就叫做中綴表示式,如a b c d 字尾表示式 又叫做逆波蘭表示式,由一名波蘭數學家提出,方便進棧操作 字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字...

中綴表示式轉換成字尾表示式

中綴表示式轉字尾表示式 思路 三個方法 將中綴表示式轉換成 中綴表示式對應的 list 自定義運算子優先順序 將中綴表示式對應的 list 轉換成 字尾表示式.1.1 使用 list 更好的和 stack 配合,list 比 字串的遍歷更加靈活.將中綴表示式對應的 list 轉換成 字尾表示式 2....