以前是怎麼處理算術表示式的?好像都是自己瞎yy的
最近資料結構學到棧的應用才發現,對於算術表示式有非常正規的處理方法 -- 棧處理
書上用的偽**,於是我偷偷自己實現了該演算法,發現書上其實是有bug的
書上的算術表示式沒有考慮十位以上的數,即預設算術表示式中的數都是個位數。。。
於是自己加了數的處理
為什麼算術表示式求值會用到棧?
算術表示式求值的難點在於,操作符的優先順序!
那麼,先看下面這張表:
這個表就很好的詮釋了每個運算子之間的優先順序
為什麼+和+之間是》呢?
因為θ1的+在θ2的+的左邊,算術表示式中乘除運算的優先順序大於加減,而左邊的運算子的優先順序又大於右邊。
而表中沒有填的部分表示正確的算術表示式不可能出現的情況
【**】
#define mem(a,x) memset(a,x,sizeof(a))
#includeusing namespace std;
typedef long long ll;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
stackopnd;//運算元棧
stackoptr;//操作符棧
//初始化棧
void initstack(stack& x)
}void initstack(stack& x)
}//op是運算子集合
setop;
void initset()
char precede(char c1,char c2)
if (c1 == '*'||c1 == '/')
if (c1 == '(')
if (c1 == ')')
if (c1 == '#')
}double turntodouble(string s)
string turntostring(double d)
double operate(double a,char c,double b)
string evaluateexpression(string s)
opnd.push(operate(a,theta,b));
break;
}//switch
}if (error) return "error!";
}//while
return turntostring(opnd.top());//將結果轉化成字串返回
}int main()
{ string s;
while (cin>>s){
cout<
【執行結果】
棧真的很好用,當學習計算機的記憶體的時候才是真正體會棧的妙處!
棧的應用之算術表示式求值
1 2 3 4 此算術表示式由一些操作符和運算元組成。其中,操作符有 等,運算元有 1 2 3 等。對於操作符來說,其運算是有優先順序的。比如,上述表示式中,3 4應該先進行操作,將得到的結果再與2相乘。算符間的優先關係如下 運算子 根據算符間的優先關係表,使用兩個棧。乙個棧為optr,儲存運算子,...
棧的應用之後綴表示式的求解
在小學的運算中,我們經常接觸到的數學表示式,它的規則也就是老生常談的了 先乘除,後加減,從左到右,先括號後括號外 但後來出現的四則運算,則要求優先順序,計算更加複雜,而計算機解決這種問題的方法就是利用棧,這就引入了字尾表示式 字尾表示式的基本概念 字尾表示式也叫逆波蘭表示式,是一種不需要括號的字尾表...
棧的應用 算術表示式求值
選擇棧作為資料結構,所以所有操作都要圍繞棧的特點來進行。因為先入棧而被壓在下面的意味著要後處理,所以優先順序低的不能壓著優先順序高的而入棧。對於同級的操作符,因為要按照從左往右的運算規則,所以也不 能壓著同級的操作符而入棧。簡單來說,與棧頂的操作符比較,優先順序高的則入棧,否則操作符出棧作相應運 算...