中綴算數表示式的求值問題

2021-09-29 11:50:27 字數 3774 閱讀 4226

void convertpostexp(char str, char str1)

把中綴表示式轉換成字尾表示式,轉換過程需要用到棧,具體過程如下:

1)設定乙個堆疊,初始時將棧頂元素置為#。

2)順序讀入中綴算數表示式,當讀到的單詞為運算元時就將其輸出,並接著讀下乙個單詞

3)當讀到的單詞為運算子時,令x1為當前棧頂運算子的變數,x2為當前掃瞄讀到運算子的變數,把當前讀入的單詞賦予變數x2,如果遇到左括號時將其直接入棧中。

3)如果遇到乙個右括號,則將棧元素出棧,將彈出的操作符輸出直到遇到左括號為止。注意,左括號只出棧並不輸出。

4)如果遇到任何其他的操作符,如(「+」,「-」,「*」,「/」「#」)等,比較變數x1的優先順序與變數x2的優先順序、若x1的優先順序高於x2的優先順序,則將x1退棧並作為字尾算術表示式的乙個單詞輸出。然後接著比較新的棧頂運算子x1的優先順序寫x2的優先順序:若x的優先順序低於x的優先順序,則將x2的值進棧,

然後接著讀下乙個單詞:若x的優先順序等於x的優先順序為「#」且為「#,則演算法結束。#退棧輸出

int postexp(char str) // 字尾表示式求值

把中綴算術表示式變換成相應的字尾算術表示式後,計算字尾算術表示式的值的過程仍是乙個堆疊應用問題。其演算法思想是:設定乙個堆疊存放運算元,從左到右依次掃瞄字尾算術表示式,每讀到乙個運算元就將其進棧,每讀到乙個運算子就從棧頂取出兩個運算元施以該運算子所代表的運算操作,並把該運算結果作為乙個新的運算元入棧,此過程直進行到字尾算術表示式讀完,最後棧頂的運算元就是該字尾算術表示式的運算結果。

main()lsnode;

void

stackinitiate

(lsnode*

* head)

;//初始化帶頭結點鏈式堆疊

intstacknotempty

(lsnode* head)

;//判斷堆疊是否非空

void

stackpush

(lsnode* head, datatype x)

;//把資料元素x插入鏈式堆疊head的棧頂作為新的棧頂

intstackpop

(lsnode* head, datatype* d)

;//出棧並把棧頂元素由引數d帶回

intstacktop

(lsnode* head, datatype* d)

;//取棧頂元素

void

destroy

(lsnode* head)

;//撤銷動態申請空間(3)linstack.c模組

#include

#include

"linstack.h"

#include

void

stackinitiate

(lsnode*

* head)

//初始化帶頭結點鏈式堆疊

intstacknotempty

(lsnode* head)

//判斷堆疊是否非空,非空,返回1,空,返回0

void

stackpush

(lsnode* head, datatype x)

//把資料元素x插入鏈式堆疊head的棧頂作為新的棧頂

intstackpop

(lsnode* head, datatype* d)

//出棧並把棧頂元素由引數d帶回,出棧成功則返回1,否則返回0

head->next = p->next;

//刪除原棧頂結點

*d = p->data;

//原棧頂結點元素賦予d

free

(p);

//釋放原棧頂結點記憶體空間

return1;

}int

stacktop

(lsnode* head, datatype* d)

//取棧頂元素並把棧頂元素由引數d帶回

*d = p->data;

return1;

}void

destroy

(lsnode* head)

//撤銷動態申請空間

}

(4)主函式main.c模組

#include

#include

#include

#include

#include

#include

"linstack.h"

intpriority

(char oper)

//定義運算子優先順序

}void

convertpostexp

(char str,

char str1)

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

else

//當str[i]為運算子時

else

if(x2 ==

')')

//當運算子為「)」時

stackpop

(head,

&x);

//將運算子「(」退棧

}else

elseif(

priority

(x1)

<

priority

(x2)

)//當棧頂運算子優先順序小於掃瞄到的運算子時,棧頂運算子退棧輸出

elseif(

priority

(x1)

==priority

(x2)

&& x1 ==

'#'&& x2 ==

'#')

//當棧頂運算子優先順序等於掃瞄到的運算子且為#時,棧頂運算子退棧輸出

else

//當棧頂運算子優先順序等於掃瞄到的運算子且不為#時,運算子進棧}}

}}str1[j +1]

='\0'

;destroy

(head);}

intpostexp

(char str)

// 字尾表示式求值

else

//當str[i]為運算子時

case

'-':

case

'*':

case

'/':

if(x2 ==

0.0)

else

}stackpush

(head, x1)

;//運算結果入棧}}

stackpop

(head,

&x);

//得到計算結果,存入x中

destroy

(head)

;return x;

//返回計算結果

}int

main()

printf

("\n");

result =

postexp

(str1)

;// 字尾表示式求值

printf

("字尾算數表示式計算結果為: %d\n"

, result)

;system

("pause");

return0;

}

⒉ 函式的呼叫關係圖

函式的呼叫關係圖反映了本演示程式的層次結構,如圖3.1所示。

圖3.1 函式呼叫關係圖

四、除錯分析

中綴表示式求值

中綴表示式用於計算乙個表示式,比如計算器 就是這樣實現的 這兒是用棧的資料結構來實現的。首先輸入乙個字串,表示乙個表示式,然後用乙個棧儲存數字,另外乙個棧儲存符號 如果當前運算子優先順序比棧頂元素優先順序高,則入棧,若當前運算子優先順序小於等於棧頂運算子優先順序,則從數字棧中彈出兩個元素,從符號棧中...

中綴表示式求值

表示式求值都需要2個棧。乙個是符號棧,另乙個是數字棧。拿上面的字尾式45 來說,咱們剛才將表示式從4 5轉換到45 的過程是咱們一眼就能看出來的,但是計算機不能像咱們這樣做,因為他不會。他只會從表示式的開頭,順序掃瞄表示式的每乙個字元,它不能像咱們一樣 一眼就 看 出來。計算機是如何轉換的呢?1.從...

中綴表示式求值

計算 calc.cpp 問題描述 小明在你的幫助下,破密了ferrari設的密碼門,正要往前走,突然又出現了乙個密碼門,門上有乙個算式,其中只有 0 9 求出的值就是密碼。小明數學學得不好,還需你幫他的忙。用整數除法 輸入 輸入檔案calc.in共1行,為乙個算式。輸出 輸出檔案calc.out共1...