problem description
讀入乙個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。
input
測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。
output
對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位。
sample input
1 + 2 4 + 2 * 5 - 7 / 11 0
sample output
3.00 13.36
利用棧來做。
因為運算子存在優先順序,不知道優先順序的出現順序,可能優先順序低的先出現 比如2 - 5 * 3, 直接計算會出錯
所以利用棧來儲存 運算子(棧中的運算子 優先順序 應該是遞增的),所以如果出現當前的運算子小於棧頂的運算子,我們就可以確定前面的算式的優先順序 可以確定了, 所以直接向前計算。一直到該運算子找到合適的位置(此處應該有while,自己沒寫wa 了)。
#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
#define rep(i,a,b) for(int i=a;i='0'&&str[i]<='9')
stk1[p1++]=sum;
while(i='0'&&str[i]<='9')
if(p2==0)else
stk2[p2++]=ch;
}stk1[p1++]=sum;
}while(p2!=0)
printf("%.2f\n",stk1[0]);
} return 0;
}
後序表示式 轉中序表示式
只是將上述直接計算,先轉換成 表示式
核心思想:比較操作符的優先順序,如果當前操作符的優先順序已經比前面低了,說明前面的運算子一定是可以計算了。
具體實現:
1.數字直接放入答案序列
2. 當前取得的操作符,和前面的比較,一直到比當前操作符低為止, 將當前操作符放入符號棧
實現細節:括號的優先順序,包括左括號和右括號;核心:括號是優先順序極高的數
後序表示式計算:
遇見操作符,找棧頂的兩個元素操作,將結果放入棧頂,一直進行。
實現**:
#includetypedef long long ll;
#define rep(i,a,b) for(int i=a;i='0'&&str[i]<='9')
arr[cnt++]=node(0,sum);
} else
} //show(cnt);
//中序轉換成後序
int cntnum=0;
rep(i,0,cnt) else
res[cntnum++]=stk[top-1];
top--;
}if(arr[i].ch!=')')stk[top++]=arr[i];
// printf("tt:%d\n",tt);
// show(cntnum);
// show2(top);
}} while(top>0)
//計算
top=0;
rep(i,0,cntnum) else
} printf("%.2f\n",sstk[0]);
} return 0;
}
hdu1237 簡單計算器
模擬棧運算,其實遞迴也可以,不過我夠嗆能寫的出來 其實老早就看過表示式求值的問題,只不過一直沒有敲過,今天敲了一下,發現還是有不少問題的 code include include include using namespace std bool check char,char void solve ...
hdu 1237 簡單計算器
模擬棧。設兩個陣列,乙個裝運算元,乙個裝操作符。根據優先順序,先乘除,後加減。include include include include char s 210 op 200 s1 200 double a 200 int char num char s1,int n 字串轉化成int型數 ret...
HDU1237 簡單計算器
problem description 讀入乙個只包含 的非負整數計算表示式,計算該表示式的值。input 測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。output 對每個測試用例...