用棧實現計算器

2021-08-22 12:05:24 字數 1422 閱讀 8176

我們平時用swith語句寫的計算器,只能處理簡單的兩個運算元和乙個運算子,這樣其實和日常應用方面差的有點遠,所以我們今天學習了一種用棧來實現一條複雜表示式的計算。這個需要用到棧的相關知識,除此之外我們還需要學會如何把中綴轉換成字尾表示式,比如:3+(4+5*2)-3這樣乙個表示式,從左至右遇到運算元壓入棧1,遇到操作符壓入棧2,當棧2的棧頂元素為空或者棧頂為『(』 時無腦壓進棧,遇到右括號『)』時出棧;遇到操作符的優先順序大於棧頂元素的優先順序時棧頂元素出棧同時去運算元的前兩個進行運算,先把上式做一下:

棧1 : 棧底---->棧頂3 4 5 2  ---->   3   4   10  ------>3   14

棧2:  棧底---->棧頂+ ( + *)此時先取*與2和5相乘得到10壓入棧1在去兩個元素進行 +即4和10

得到:棧1    3   14     ------->   17 --------->17  3

棧2:   +    『-』的優先順序不大於+所以棧頂的元素出棧即進行 3+14 = 17 --------->-

最終得到17 - 3 = 14

重要:當運算子出棧時,拿運算元棧裡的次於棧頂元素去加減乘除棧頂元素

這是在用棧實現計算器時所有需要考慮的因素,**如下:標頭檔案部分前面也有詳細說明重複貼**了

#include#include"linkstack.h"

int perorty(char ch)

}int main()

; int i = 0, num1 = 0, num2 = 0, tmp = 0;

if((linkstackinit(&s_num) != success) || (linkstackinit(&s_opt) != success))

printf("input:\n");

scanf("%s",opt);

while(opt[i] !='\0'|| stackempty(s_opt) != true)

}else

if(stackempty(s_opt) == true || (perorty(opt[i]) > perorty(gettop(s_opt)))

|| (gettop(s_opt) == '(' && opt[i] != ')'))

if((opt[i] == '\0' && stackempty(s_opt) != true) ||

(opt[i] == ')' && gettop(s_opt) != '(') ||

perorty(opt[i] <= perorty(gettop(s_opt))))}}

}printf("%d\n", gettop(s_num));

return 0;

}

用棧實現的計算器

問題描述 描述 從鍵盤輸入乙個算術表示式 保證是整數 並輸出它的結果 保證資料中除法是整除 輸入 輸入一行字串表示算術表示式包括0.9,輸出 每行輸出計算結果 規則 1.自左至右掃瞄表示式,凡是遇到運算元一律進運算元棧。2.當遇到運算子時如果它的優先順序比運算子棧棧頂元素的優先順序高就進棧。反之,取...

C C 用棧實現計算器

使用棧實現計算器,最主要的就是進行運算子的優先順序判斷,然後進行對應的計算,然後將其壓入棧和從棧中取出來。其中要對輸入的表示式進行判斷,如果表示式不符合的話就直接不用計算。下面直接上 include include include using namespace std const int maxs...

用棧實現基本計算器

趣味 演示 1.3 演示 實現乙個基本的計算器來計算乙個簡單的字串表示式 s 的值。示例 1 輸入 s 1 1 輸出 2 示例 2 輸入 s 2 1 2 輸出 3 因為睡眠不好的原因,總覺得頭脹脹的,精神狀態不好,但每日演算法的斷更又是我所不能接受的。所以這一篇我就用了力扣官方的題解,來為大家解析一...