棧的應用 計算器實現四則運算

2021-08-11 18:22:15 字數 2020 閱讀 8908

學習乙個知識點並不是那麼難,而要運用所學的知識點去實現乙個功能或者做乙個專案卻總不是那麼簡單。就像這個標題,如何用棧來做出乙個計算器呢?

我們先來思考一番,比如有個式子:9 + (3 - 1) * 3 + 10 / 2 , 遇到這個式子我們可能一氣呵成就能寫出答案是20,因為我們從小學就開始學習數學然後計算,我們太習慣了去做這件事而忘記了去思考為什麼要這麼做。我們先放慢100倍我們的腦速,第一步,我們直接鎖定了括弧,然後乘除,最後是加減,沒錯,我們考慮了優先順序,然後,除了運算子,剩下的就是數字了。那麼,這些跟棧有什麼關係呢?我們是不是可以設定兩個棧,乙個用來放數字,另乙個用來放運算子(操作符),但是,乙個正常的式子都是乙個數字然後乙個運算子,交替著組成乙個式子,這樣表示方式叫做中綴表示式。如果我們按從左到右的順序來分別安放數字和運算子,那麼優先順序不就完全被打亂麼。可見這樣是行不通的。

所以,我們要引入一種不需要括號的字尾表示式,叫做逆波蘭(rpn)表示。接著這個栗子來說,如果用字尾表示式應該為:「9 3 1 - 3 * + 10 2  / +」 ,顧名思義就是所有的符號都要在運算數字的後面了。

怎麼將中綴表示式轉為字尾表示式呢?

規則:從左到右遍歷中綴表示式的每個數字和符號,若是數字就輸出,即成為字尾表示式的一部分;若是符號,則判斷其與棧頂符號的優先順序,若是右括號或優先順序低於棧頂符號,則棧頂元素依次出棧並輸出,並將當前符號進棧,一直到最終輸出字尾表示式為止。

是不是已經暈了。我們就拿剛才的栗子強行分析一波。直接將中綴轉字尾以及對字尾的計算於一體,簡單粗暴。

接下來我們用語言來把上面的思路表達出來:

#include #include #define ok       1000

#define error 2000

/* 定義結點結構體 */

struct node

;typedef struct node node;

/* 定義棧結構體 */

struct stack

;typedef struct stack stack;

/* 初始化棧 */

int initstack(stack *s)

/* 判斷棧空 */

int emptystack(stack *s)

/* 進棧 */

int push(stack *s, int e)

p->data = e;

p->next = s->top;

s->top = p;

s->count++;

return ok;

}/* 獲取棧頂 */

int gettop(stack *s)

/* 自定義優先順序 */

int priority(char s)

}/* 出棧 */

int pop(stack *s)

int main()

; int i = 0, tmp = 0, j;

if (initstack(&num) != ok || initstack(&opt) !=ok)

printf("please input operator :\n");

scanf("%s", str);

while (str[i] != '\0' || emptystack(&opt) != ok)

}else

//出棧不運算

if (gettop(&opt) == '(' && str[i] == ')')

//出棧運算

if ((str[i] != '\0' && emptystack(&opt) != ok) || (str[i] == ')' && gettop(&opt)!= '(') ||

priority(str[i]) <= priority(gettop(&opt)))

continue;

}} }

printf("result is:%d\n",pop(&num));

}

棧實現計算器(簡單四則運算)

主要是通過定義乙個數棧和乙個符號棧,並根據給出的計算式進行拆分,迴圈判斷是數字還是符號,考慮數字的連續性和符號計算的優先順序,具體實現如下 package com.pangzi.stucture public class calculator else else elseelse 讓index 1,...

python 計算器 四則運算

學習來自 感謝!思路 考慮的四則運算符號 獲取表示式字串 表示式切分 請注意區分 減號 與負號 先出初切 formula list i for i in re.split d d formula if i 然後再判定 if re.search final formula 1 其他正常切分就行 ite...

四則運算計算器

今天做個帶視窗的c 四則運算計算器 輸入中綴表示式 自然表示式 可以用list來放 先把它變成字尾表示式 逆波蘭表示式 用乙個棧放運算子,另乙個棧放字尾表示式 運算子優先順序 1 2 3 4 從左到右遍歷中綴表示式 計算字尾表示式 從左到右掃瞄字尾表示式,如果是數字,放入數字棧。如果是符號,從數字棧...