簡單計算器(stack)
題目描述
讀入一個只包含 +, -, *, / 的非負整數計算表達式,計算該表達式的值。
輸入
測試輸入包含若干測試用例,每個測試用例占一行,每行不超過200個字符,整數和運算符之間用一個空格分隔。沒有非法表達式。當一行中只有0時輸入結束,相應的結果不要輸出。
輸出
對每個測試用例輸出1行,即該表達式的值,精確到小數點后2位。
樣例輸入
30 / 90 - 26 + 97 - 5 - 6 - 13 / 88 * 6 + 51 / 29 + 79 * 87 + 57 * 92
0
樣例輸出
12178.21
用棧的思想,將中綴表達式轉換成后綴表達式
轉換規則:
1、如果是空格,i++,跳過;
2、如果是數字,記錄這個完整的數字,放入data棧內;
3、如果是運算符號,判斷優先級別是否高于sig棧頂元素,若是,把當前的符號進棧
#include<bits/stdc++.h> using namespace std; typedef long long ll; int Rank(char f) { int aa; if(f=='*'||f=='/') aa=2; if(f=='+'||f=='-') aa=1; return aa; } int main() { stack<char> sig; stack<double> data; string str; ll i,t; while(1) { getline(cin,str); if(str=="0") { break; } i=t=0; while(str[i]||!sig.empty()) { if(str[i]==' ') { i++; } else if(str[i]>='0'&&str[i]<='9') { t=t*10+str[i]-'0'; i++; if(str[i]<'0'||str[i]>'9') { data.push(t); t=0; } } else if(sig.empty()||Rank(str[i])>Rank(sig.top())) { sig.push(str[i]); i++; } else { double fir,sec; switch(sig.top()) { case '+': { fir=data.top(); data.pop(); sec=data.top(); data.pop(); data.push(fir+sec); } break; case '-': { fir=data.top(); data.pop(); sec=data.top(); data.pop(); data.push(sec-fir); } break; case '*': { fir=data.top(); data.pop(); sec=data.top(); data.pop(); data.push(fir*sec); } break; case '/': { fir=data.top(); data.pop(); sec=data.top(); data.pop(); data.push(sec/fir); } break; } sig.pop(); } } printf("%.2f\n",data.top()); } return 0; }
作者:Drophair
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須在文章頁面給出原文連接,否則保留追究法律責任的權利。

浙公網安備 33010602011771號