簡單計算器 HDU 1237

2021-09-24 23:33:42 字數 1840 閱讀 6244

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 對每個測試用例...