棧的應用之求解算術表示式

2021-07-24 04:35:33 字數 1557 閱讀 4505

以前是怎麼處理算術表示式的?好像都是自己瞎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,儲存運算子,...

棧的應用之後綴表示式的求解

在小學的運算中,我們經常接觸到的數學表示式,它的規則也就是老生常談的了 先乘除,後加減,從左到右,先括號後括號外 但後來出現的四則運算,則要求優先順序,計算更加複雜,而計算機解決這種問題的方法就是利用棧,這就引入了字尾表示式 字尾表示式的基本概念 字尾表示式也叫逆波蘭表示式,是一種不需要括號的字尾表...

棧的應用 算術表示式求值

選擇棧作為資料結構,所以所有操作都要圍繞棧的特點來進行。因為先入棧而被壓在下面的意味著要後處理,所以優先順序低的不能壓著優先順序高的而入棧。對於同級的操作符,因為要按照從左往右的運算規則,所以也不 能壓著同級的操作符而入棧。簡單來說,與棧頂的操作符比較,優先順序高的則入棧,否則操作符出棧作相應運 算...