利用stack開發一款簡單的表示式求值軟體
通過鍵盤輸入表示式,表示式可包含加(+)、減(-)、乘(*)、除(/)、求模(%)、開方(&)和乘方(^)運算,並能使用括號,最後以「=」結束
計算表示式,並在顯示器上輸出結果;如果表示式非法,則輸出錯誤資訊。
建立兩個棧(optr和opnd),分別用來儲存運算子和運算元
通過鍵盤輸入乙個表示式
逐個判斷表示式中的字元為數字,運算子還是其他非法字元,知道碰到等於符號
(1) 若為數字,將其push進運算元棧(opnd),繼續處理下乙個字元。
(2) 若為運算子,比較此運算子(棧外優先順序)與運算子棧(optr)中最頂端元素(棧內優先順序)的優先順序。
(3) 若棧內優先順序低於棧外優先順序,則將當前字元push入運算子棧(optr), 繼續處理下乙個字元。
(4) 若棧內優先順序高於棧外優先順序, 從運算元棧(opnd)中pop出2個運算元,從運算子棧(optr)中pop出最頂端運算子進行計算,並將計算結果push進運算元棧(opnd) ,繼續處理當前字元。
(5) 若棧內優先順序等於棧外優先順序, 從運算子棧(optr)中pop出最頂端運算子, 繼續處理下乙個字元。
(6) 若為其他字元, 輸出提示表示式非法, 退出程式。
輸出最終運算結果,即運算元棧(opnd)中的棧頂元素。
#pragma once
template<
class
e>
struct link
link
(e item, link
*add_on = null)
};
#pragma once
#include"link.h"
template<
class
e>
class
stack
/*判斷是否為空棧*/
bool empty()
const
/*入棧*/
bool push
(const e &item)
/*出棧*/
bool pop()
/*取棧頂元素賦給形參*/
bool top
(e &item)
const
}/*清空棧*/
void
clear()
/*析構函式*/
~stack()
};
#include
#include
#include
#include"link.h"
#include"stack.h"
using namespace std;
template<
class
e>
class
calculator
/*棧外優先順序*/
intosp
(char op)
/*判斷字元是否為數字0-9*/
bool isdigit
(char ch)
/*從棧內取出兩個運算元*/
bool get2operands
(double
&x,double
&y) opnd.
top(y)
;//取棧頂元素賦給 y,第乙個運算元
opnd.
pop();
if(opnd.
empty()
) opnd.
top(x)
;//取棧頂元素賦給 x,第二個運算元
opnd.
pop();
return
true;}
/*形成運算指令,進行運算*/
bool dooperator
(char op)
opnd.
push
(x / y)
;break
;case
'%':if(
(long
)y ==0)
opnd.
push((
long
)x %
(long
)y);
break
;case
'&':
if(x <
0|| y <0)
opnd.
push
(sqrt
(x + y));
break
;case
'^':
opnd.
push
(pow
(x, y));
}return
true;}
else
return
false;}
/*從輸入流獲取一字元ch,並跳過空格及回車*/
void
getnextchar
(char
&ch)
/*判斷ch是否為操作符*/
bool isoperator
(char ch)
public
:/*執行表示式*/
void
run(
)while
(optr_top !=
'='|| ch !=
'=')
elseif(
!isoperator
(ch)
)else
elseif(
isp(optr_top)
>
osp(ch)
)elseif(
isp(optr_top)
==osp
(ch)
&& ch ==
')')}if
(optr.
top(optr_top)
==false)}
if(opnd.
top(operand)
==false
|| optr.
pop()==
false
)else
cout << operand << endl;
return;}
}};int
main()
system
("pause");
return0;
}
表示式求值(c 實現)
今天寫了乙個表示式求值的程式。基本功能為 輸入乙個表示式比如23 34 21 56 45 1 然後程式求出結果。而且按照四則運算的優先順序,同時支援括號。下面是程式執行的畫面 程式的難點在於把乙個字串分解為運算元和操作符並能正確處理各個操作符的優先順序,特別是有括號的情況。本程式主要採用了傳統的方法...
Python實現簡單表示式求值
問題 於清華大學出版社1992年第二版 資料結構 3.2節 表示式求值。書中採用了 算符優先法 並提供了演算法的偽 本文是偽碼的python實現。問題的簡要描述 具體可參考 資料結構 本文僅討論個位數的包含加減乘除和小括號的表示式,並規定表示式以 結束。表示式例項 3 7 2 不討論表示式語法錯誤的...
簡單表示式求值
char evaluateexpression else c getchar gettop optr,e else gettop opnd,e return e 核心演算法如圖所示,基本思想是利用棧的基本性質和操作 數棧和算符棧兩棧分開 結合算符優先順序順序的二維陣列定義,完成基本算數表示式的核心演...