HDU_1237 一個簡單的計算器

weixin_43342538發表於2019-04-12

連結在此:https://vjudge.net/contest/291337#problem/D
中文題解:
讀入一個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。
Input
測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用一個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。
Output
對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位。
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output
3.00
13.36
看這道題一頭霧水,完全沒有思路,看別人的程式碼,用棧是一種很好的思路
解法:把第一個數壓入棧,接下來根據每次的運算子來確定操作方法,若是加或減,把輸入的x或-x繼續壓入棧中,若是乘或除,則將運算子前面的數字取出,也就是棧頂的元素,運算後繼續壓入棧內,這樣輸入結束之後就可以直接將棧內的元素加起來即是所求結果
程式碼在此:


   #include<cstdio>
#include<iostream>
#include<queue>
#include<stack>
#include<cstring>
using namespace std;
int main()
{
	double a;
	char c;
	stack<double>s;
	while(cin>>a)
	{
		double x;
		s.push(a);
		if(getchar()!=' ')break;
		while(1)
		{
			
			c=getchar();
			cin>>a;
			if(c=='+')
			{
				s.push(a);
			}
			else if(c=='-')
			{
				s.push(-a);
			}
			else if(c=='*')
			{
				x=s.top();
				s.pop();
				s.push(x*a);
			}
			else if(c=='/')
			{
				x=s.top();
				s.pop();
				s.push(x/a);
			}
			if(getchar()!=' ')break;
		}
		double sum=0;
		while(!s.empty())
		{
			sum+=s.top();
			s.pop();
		}
		printf("%.2lf\n",sum);
	}

} 

相關文章