C++實現(xiàn)中綴表達式轉(zhuǎn)化為后綴表達式詳解_第1頁
C++實現(xiàn)中綴表達式轉(zhuǎn)化為后綴表達式詳解_第2頁
C++實現(xiàn)中綴表達式轉(zhuǎn)化為后綴表達式詳解_第3頁
C++實現(xiàn)中綴表達式轉(zhuǎn)化為后綴表達式詳解_第4頁
C++實現(xiàn)中綴表達式轉(zhuǎn)化為后綴表達式詳解_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第C++實現(xiàn)中綴表達式轉(zhuǎn)化為后綴表達式詳解目錄1.題目描述2.輸入輸出3.解題思路4.樣例解析5.代碼實現(xiàn)5.1.優(yōu)先級確認5.2.轉(zhuǎn)換函數(shù)

1.題目描述

所謂后綴表達式是指這樣的一個表達式:式中不再引用括號,運算符號放在兩個運算對象之后,所有計算按運算符號出現(xiàn)的順序,嚴格地由左而右進行(不用考慮運算符的優(yōu)先級)。

如:中綴表達式3*(52)+7對應(yīng)的后綴表達式為:352-*7+。

請將給出的中綴表達式轉(zhuǎn)化為后綴表達式并輸出。

2.輸入輸出

輸入樣例:

2+4*8+(8*8+1)/3

輸出樣例:

248*+88*1+3/+

3.解題思路

對于中綴表達式轉(zhuǎn)換為后綴表達式,我們需要用以下步驟來解決這個問題:

1.初始化一個個棧:運算符棧S1

2.從左往右開始掃描中綴表達式

I.遇到數(shù)字,直接輸出

II.遇到運算符:

若為(直接入棧若為)將符號棧中的元素依次出棧并輸出,直到(,(只出棧,不輸出若為其他符號,將符號棧中的元素依次出棧并將其輸出,直到遇到比當前符號優(yōu)先級更低的符號或者(。將當前符號入棧。掃描完后,將棧中剩余的符號依次輸出。

4.樣例解析

下面以a+b*c+(d*e+f)*g為例子來講講計算機的轉(zhuǎn)換過程。

1.從左向右開始遍歷表達式,首先遇到a,直接將其輸出

此時輸出:a

棧的情況:空

2.繼續(xù)遍歷表達式,遇到+,此時???,則將其放入棧中

此時輸出:a

棧的情況:+

3.繼續(xù)遍歷表達式,遇到b,直接將其輸出

此時輸出:ab

棧的情況:+

4.繼續(xù)遍歷表達式,遇到*,因為*的優(yōu)先級大于棧頂?shù)?,所以將*入棧

此時輸出:ab

棧的情況:+*

5.繼續(xù)遍歷表達式,遇到c,直接將其輸出

此時輸出:abc

棧的情況:+*

6.繼續(xù)遍歷表達式,遇到+,因為+的優(yōu)先級低于棧頂?shù)?,所以將棧頂?shù)?彈出;然后新的棧頂元素的+與當前的+優(yōu)先級相同,所以也要將+彈出;然后??樟耍瑢F(xiàn)在這個+放入棧中

此時輸出:abc*+

棧的情況:+

7.繼續(xù)遍歷表達式,遇到(,直接將其放入棧中,不遇到)不會將(彈出。

此時輸出為:abc*+

棧的情況為:+(

8.繼續(xù)遍歷表達式,遇到d,直接將其輸出

此時輸出為:abc*+d

棧的情況為:+(

9.繼續(xù)遍歷表達式,遇到*,因為棧頂為(,不遇到)不將(彈出,故直接將*放入棧中。

此時輸出為:abc*+d

棧的情況為:+(*

10.繼續(xù)遍歷表達式,遇到e,直接將其輸出

此時輸出為:abc*+de

棧的情況為:+(*

11.繼續(xù)遍歷表達式,遇到+,因為+比棧頂*的優(yōu)先級低,故將*彈出;新的棧頂元素為(,不遇到)不彈出(,故將+放入棧中。

此時輸出為:abc*+de*

棧的情況為:+(+

12.繼續(xù)遍歷表達式,遇到f,直接將其輸出

此時輸出為:abc*+de*f

棧的情況為:+(+

13.繼續(xù)遍歷表達式,遇到),直接將棧中元素依次彈出并輸出直到遇到(為止,注意:(彈出但不輸出。

此時輸出為:abc*+de*f+

棧的情況為:+

14.繼續(xù)遍歷表達式,遇到*,因為*的優(yōu)先級大于棧頂元素+的優(yōu)先級,故直接將*入棧。

此時輸出為:abc*+de*f+

棧的情況為:+*

15.繼續(xù)遍歷表達式,遇到g,直接將其輸出。

此時輸出為:abc*+de*f+g

棧的情況為:+*

16.繼續(xù)遍歷表達式,為空,遍歷結(jié)束。將棧內(nèi)元素依次彈出。

此時輸出為:abc*+de*f+g*+

棧的情況為:空

至此,中綴表達式轉(zhuǎn)后綴已經(jīng)全部完成,結(jié)果為abc*+de*f+g*+

5.代碼實現(xiàn)

5.1.優(yōu)先級確認

intpriority(charop)

intpriority;

if(op=='*'||op=='/')priority=2;

if(op=='+'||op=='-')priority=1;

if(op=='(')priority=0;

returnpriority;

}

5.2.轉(zhuǎn)換函數(shù)

//引用符號提高轉(zhuǎn)換效率

voidTrans(stringstr,stringstr1)

stackchar

inti;

for(i=0;istr.size();i++)

//是數(shù)字的情況下直接輸出

if(str[i]='0'str[i]='9'||str[i]='a'str[i]='z')

str1+=str[i];

else//不是數(shù)字的情況分類討論進行判斷

//棧為空時直接入棧

if(s.empty())s.push(str[i]);

//左括號入棧

elseif(str[i]=='(')s.push(str[i]);

//如果是右括號,只要棧頂不是左括號,就彈出并輸出

elseif(str[i]==')')

while(s.top()!='(')

str1+=s.top();

s.pop();

//彈出左括號,但不輸出

s.pop();

else

//棧頂元素的優(yōu)先級大于等于當前的運算符,就將其輸出

while(priority(str[i])=priorty(s.top()))

str1+=s.top();

s.pop();

//棧為空,停止

if(s.empty())break;

s.push(str[i]);

//最后,如果不為空,就把所以的元素全部彈出

while(!s.empty())

str1+=s.top();

s.pop();

}

#includeiostream

#includecstring

#includestack

usingnamespacestd;

intpriority(charop)

intpriority;

if(op=='*'||op=='/')priority=2;

if(op=='+'||op=='-')priority=1;

if(op=='(')priority=0;

returnpriority;

//引用符號提高轉(zhuǎn)換效率

voidTrans(stringstr,stringstr1)

stackchar

inti;

for(i=0;istr.size();i++)

//是數(shù)字的情況下直接輸出

if(str[i]='0'str[i]='9'||str[i]='a'str[i]='z')

str1+=str[i];

else//不是數(shù)字的情況分類討論進行判斷

//棧為空時直接入棧

if(s.empty())s.push(str[i]);

//左括號入棧

elseif(str[i]=='(')s.push(str[i]);

//如果是右括號,只要棧頂不是左括號,就彈出并輸出

elseif(str[i]==')')

while(s.top()!='(')

str1+=s.top();

s.pop();

//彈出左括號,但不輸出

s.pop();

else

//棧頂元素的優(yōu)先級大于等于當前的運算符,就將其輸出

while(priority(str[i])=priorty(s.top()))

str1+=s.top();

s.pop();

//棧為空,停止

if(s.empty())break;

s.push(str[i]);

//最后,如果不為空,就把所以的元素全部彈出

while(!s.empty())

str1+=s.top();

s.pop();

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論