深入了解棧和佇列的特性,學會在實際問題下靈活運用它們。
表示式求值運算是實現程式語言的基本問題之一,也是棧應用的乙個典型例子。設計並演示用算符優先順序對算術表示式的求解過程。
1、演算法優先級別如下:
2、以字串行的形式從終端輸入語法正確、不含變數的算術表示式,利用給出的算符優先順序關係,實現對算術四則混合運算的求解過程。
pc微機
dos作業系統或 windows 作業系統
turbo c 程式整合環境或 visual c++ 程式整合環境
1、根據給出的算符優先順序,設定運算子棧和運算數棧;
2、在讀入表示式的同時,完成運算子和運算數的識別處理,並將運算數的字串行形式轉換成整數形式,並進行相應的運算;
3、除錯程式,檢查輸出結果;
4、實驗小結。
1.輸入資料:1+(20+4)/(4-1)
正確結果:9
2.輸入資料:2*9-6-(20+4)/(4-1)
正確結果:4
1、問題描述;
2、演算法的設計描述;
3、測試結果的分析與討論;
4、實現演算法的程式清單,應有足夠的注釋。
#include
using
namespace std;
#include
typedef
bool status;
constexpr
auto ok =1;
constexpr
auto error =0;
stack<
double
>operandsoriginal;
stack<
char
> operatororiginal;
stack<
double
>operands;
stack<
char
> operator;
void
calculation()
;char
number
(char a)
opead =
(opead +
int(a)-48
)*10;
}}status expression_input()
else
if(a ==
'+'|| a ==
'-'|| a ==
'*'|| a ==
'/'|| a ==
'('|| a ==
')')}}
void
reverse()
while
(!operatororiginal.
empty()
)}void
badditionandsubtraction
(char operator1)
//括號內加減法運算
void
bmultiplicationanddivision
(char operator1)
//括號內乘除法運算
void
additionandsubtraction
(char operator1)
//加減法
void
multiplicationanddivision
(char operator1)
//乘除法
void
bracketcirculation()
while
(!operatororiginal.
empty()
)badditionandsubtraction
(operator1);}
else
badditionandsubtraction
(operator1);}
else
if(operator1 ==
'*'|| operator1 ==
'/')
bmultiplicationanddivision
(operator1);}
tmp = operandsoriginal.
top();
operandsoriginal.
pop();
operands.
push
(tmp);}
//括號運算
void
calculation()
else
if(operator2 ==
'(')
else
if(operator2 ==
'+'|| operator2 ==
'-')
additionandsubtraction
(operator1);}
else
additionandsubtraction
(operator1);}
else
if(operator1 ==
'*'|| operator1 ==
'/')
multiplicationanddivision
(operator1);}
else
multiplicationanddivision
(operator1);}
else
if(operator1 ==
'(')
}//計算模組
利用堆疊進行表示式求值
基本策略 將中綴表示式轉換為字尾表示式,然後求值 中綴表示式轉換為字尾表示式的流程 從頭到尾讀取中綴表示式的每個物件,對不同的物件按不同的情況處理 1 運算數 直接輸出 2 左括號 壓入堆疊,入棧前左括號的優先順序最高,入棧之後其優先順序降到最低 3 右括號 將棧頂的運算子彈出並輸出,直到遇到左括號...
表示式求值 棧的利用
棧的功能 棧的順序儲存 include include define maxsize 100 typedef char elemtype typedef struct sqstack sqstack void init s sqstack s 檢測完畢 void out s sqstack s pr...
利用棧對表示式求值
輸入中綴表示式空格分隔 例如 2 3 展示如下 順序從右向左,無優先順序順序,圖中順序 4 5 20,20 4 24,結果為24 考慮優先順序的運算表示式求值 以上為不考慮優先順序的表示式求值方法,那麼接下來考慮優先順序時,將考慮 換成程式設計思路 執行表示式運算時,總是將結果壓入numstack棧...