# 簡單計算器
**Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 16351????Accepted Submission(s): 5604**
Problem Description
讀入一個只包含 +, -, *, / 的非負整數計算表達式,計算該表達式的值。
Input
測試輸入包含若干測試用例,每個測試用例占一行,每行不超過200個字符,整數和運算符之間用一個空格分隔。沒有非法表達式。當一行中只有0時輸入結束,相應的結果不要輸出。
Output
對每個測試用例輸出1行,即該表達式的值,精確到小數點后2位。
Sample Input
~~~
1 + 2
4 + 2 * 5 - 7 / 11
0
~~~
Sample Output
~~~
3.00
13.36
~~~
1.將原表達式轉為后綴式在求值
2.代碼:
~~~
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
char s[1000];
int ss[1000];
int a[1000];
char s1[100];
char s2[1000];
int hsh[300];
int e[10];
int main()
{
hsh['#']=-1;
hsh['+']=0;
hsh['-']=0;
hsh['*']=1;
hsh['/']=1;
e[0]=1;
e[1]=10;
e[2]=100;
e[3]=1000;
e[4]=10000;
e[5]=100000;
e[6]=1000000;
e[7]=10000000;
e[8]=100000000;
e[9]=1000000000;
while(gets(s))
{
if(strcmp(s,"0")==0)
break;
int len=strlen(s);
int pos=0;
stack<char> S;
S.push('#');
s[len]=' ';
int j=0;
int k=0;
int l=0;
for(int i=0; i<=len; i++)
{
if(s[i]>='0'&&s[i]<='9')
s1[j++]=s[i];
else if(s[i]==' ')
{
int x=0;
for(int jj=0; jj<j; jj++)
{
x+=(s1[jj]-'0')*e[j-1-jj];
}
if(j!=0)
a[l++]=x;
j=0;
}
else
s2[k++]=s[i];
}
s2[k]='#';
for(int i=0; i<=k+l; i++)
{
if(i%2==1)
{
while(!S.empty()&&hsh[S.top()]>=hsh[s2[i/2]])
{
if(S.top()!='#')
{
char cc=S.top();
if(cc=='+')
ss[pos++]=-1;
if(cc=='-')
ss[pos++]=-2;
if(cc=='*')
ss[pos++]=-3;
if(cc=='/')
ss[pos++]=-4;
};
S.pop();
}
S.push(s2[i/2]);
}
else
ss[pos++]=a[i/2];
}
stack<double> SS;
for(int i=0; i<pos; i++)
{
if(ss[i]>=0)
{
double x=(double)ss[i];
SS.push(x);
}
else
{
double sec=SS.top();
SS.pop();
double fir=SS.top();
SS.pop();
if(ss[i]==-1)
{
fir=fir+sec;
}
if(ss[i]==-2)
{
fir=fir-sec;
}
if(ss[i]==-3)
{
fir=fir*sec;
}
if(ss[i]==-4)
{
fir=fir/sec;
}
SS.push(fir);
}
}
printf("%.2lf\n",SS.top());
}
return 0;
}
~~~
- 前言
- The 12th Zhejiang Provincial Collegiate Programming Contest - D
- 用鄰接表存儲n個頂點m條弧的有向圖
- hdu 5289 Assignment(給一個數組,求有多少個區間,滿足區間內的最大值和最小值之差小于k)
- hdu 1358 Period(給定一個字符串,求有多少個前綴(包括自己本身),它是由k(k&gt;2,并且盡量大)個循環節組成的)
- hdu 1806 Frequent values(給定一個非降序數組,求任意區間內出現次數最多的數的次數)
- poj 3264 Balanced Lineup(查詢區間最大值與最小值的差)
- HDU 1010 Tempter of the Bone(DFS+奇偶剪枝)
- HDU 1015 Safecracker(第一次用了搜索去遍歷超時,第二次用for循環可以了,思路一樣的)
- HDU 1016 Prime Ring Problem(DFS)
- HDU 1026 Ignatius and the Princess I(BFS+記錄路徑)
- HDU 1072 Nightmare(BFS)
- HDU 1237 簡單計算器(后綴式+棧)