堆疊入門 簡單計算器

2022-07-05 18:30:16 字數 2584 閱讀 8319

題目鏈結

解題思路:

利用堆疊對表示式求值的方法在任意一本資料結構教科書上都會做明確的闡述。這裡簡單的回顧:

1.設立兩個堆疊,乙個用來儲存運算子,另乙個用來儲存數字。

2.在表示式首尾新增標記運算子,該運算子運算優先順序最低。

3.從左至右依次遍歷字串,若遍歷到運算子,則將其與運算子棧棧頂元素進行比較,若運算子棧棧頂運算子優先順序小於該運算子或者此時運算子棧為空,則將該運算子壓入堆疊。遍歷字串中下乙個元素。

4.若運算子棧棧頂運算子優先順序大於該運算子,則彈出該棧頂運算子,再從數字棧中依次彈出兩個棧頂數字,完成彈出的運算子對應的運算得到結果後,再將該結果壓入數字棧,重複比較此時棧頂運算子與當前遍歷到的運算子優先順序,視其優先順序大小重複步驟 3 或步驟 4。

5.若遍歷到表示式中的數字,則直接壓入數字棧。

6.若運算子堆疊中僅存有兩個運算子且棧頂元素為我們人為新增的標記運算子,那麼表示式運算結束,此時數字堆疊中唯一的數字即為表示式的值。 

解題要點:

設定結束符:判斷乙個表示式的結束。

兩個棧結構:分別存放數字和運算子。

優先順序設定:棧頂運算子就是當前優先順序最高的運算子,如果之後的運算子優先順序小於棧頂運算子,說明必須執行該棧頂運算子的運算。

ac**:

#include#include

using

namespace

std;

char str[220];//

儲存表示式字串

int mat[5] = //

優先順序矩陣,若mat[i][j] == 1,則表示i號運算子優先順序大於j號運算子,運算子編碼規則為+為1號,-為2號,*為3號,/為4號,我們人為新增在表示式首尾的標記運算子為0號

;stack

op;//

運算子棧,儲存運算子編號

stack in;//

數字棧,運算結果可能存在浮點數,所以儲存元素為double

void getop(bool &reto, int &retn, int&i)//

獲得表示式中下乙個元素函式,若函式執行結束時,引用變數reto為true,則表示該元素為乙個運算子,其編號儲存在引用變數retn中; 否則,表示該元素為乙個數字,其值儲存在引用變數retn中.引用變數i表示遍歷到的字串下標

if (str[i] == 0)//

若遍歷字元為空字元,表示字串已被遍歷完

if (str[i] >= '

0' && str[i] <= '

9')//

若當前字元為數字

else

//否則

retn = 0;//

返回結果為數字

for (; str[i] != '

'&&str[i] != 0; i++)//

若字串未被遍歷完且下乙個字元不是空格,則依次遍歷後面的數字並計算出連續數字字元表示的數值

if (str[i] == '

')i++;//

其後字元為空格,表示字串未被遍歷完,跳過該空格

return;}

intmain()

op.push(retnum);

//將當前運算子壓入運算子棧

} }

if (op.size() == 2 && op.top() == 0)break;//

運算子棧只有兩個元素,且棧頂為標記運算子,表示求值結束

} printf(

"%.2f\n

", in.top());//

輸出數字棧唯一的數字,即為答案

}

return0;

}

#include#include

using

namespace

std;

char s[220];//

表示式字串

int mat[5] = ;

stack

op;//

運算子棧

stackn;//

數字棧,可能有浮點數

void getop(bool &isop, int &num, int &i)

if (s[i] == 0)//

當前遍歷字元為空字元,加入終止標記運算子

if (s[i] >= '

0'&&s[i] <= '9'

)

if (s[i] == '

')i++;//

跳過空格

return

; }

else

}int

main()

op.push(num);}}

if (op.size() == 2 && op.top() == 0)break

; }

printf(

"%.2f\n

", n.top());//

輸出數字棧唯一的數字,即為答案

}

return0;

}

二刷

堆疊實現簡單計算器

讀入乙個只包含加減乘除的非負整數計算表示式,計算表示式的值,整數和運算子之間用乙個空格分隔。include include using namespace std char str 200 儲存表示式字串 int mat 5 stack int op 運算子棧 stack double in 數字棧...

HDU1237 簡單計算器 堆疊

讀入乙個只包含 的非負整數計算表示式,計算該表示式的值。input 測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。output 對每個測試用例輸出1行,即該表示式的值,精確到小數點後...

簡單計算器

unit unit1 inte ce uses windows,messages,sysutils,variants,classes,graphics,controls,forms,dialogs,stdctrls,buttons,math math是數 算單元 type tform1 class ...