杭电hdu 1237 简单计算器 stack

http://acm.hdu.edu.cn/showproblem.php?pid=1237

堆栈的简单应用

//hdu_1237 简单计算器 stack的应用
#include <cstdio>
#include <iostream>
#include <stack>
#include <cstring>

using namespace std;

stack<double > snum;
stack<char >sop;

int main()
{
	int len, i;
	double res, tmpa, tmpb;
	char tmp;
	char str[201];
	while(gets(str)){
		len = strlen(str);
		if(len == 1 && str[0] == '0')break;
		tmpa = 0;
		for(i = 0; i < len; i ++){
			if(str[i] == ' '){
				i ++;
				if(snum.empty()){//第一个操作数和第一个操作符
//					printf("%lf\n", tmpa);
					snum.push(tmpa);
					sop.push(str[i]);
				}
				else{
					if((sop.top() ==  '+'||sop.top() == '-') &&(str[i] == '*' || str[i] == '/')){
						snum.push(tmpa);
						sop.push(str[i]);
					}
					else{
						snum.push(tmpa);
						//处理相同的操作数和操作符
						while(!sop.empty()){
							if((sop.top() ==  '+'||sop.top() == '-') &&(str[i] == '*' || str[i] == '/'))break;
							tmpa = snum.top();
							snum.pop();
							tmp = sop.top();
							sop.pop();
							tmpb = snum.top();
							snum.pop();
				//			printf("%c\n", tmp);
							switch(tmp){
							case '+':
								res = tmpb + tmpa;
				//				printf("+%lf\n", tmpa);
								snum.push(res);
								break;
							case '-':
								res = tmpb - tmpa;
								snum.push(res);
								break;
							case '*':
								res = tmpb * tmpa;
								snum.push(res);
								break;
							case '/':
								res = tmpb*1.0/tmpa;
								snum.push(res);
								break;
							}
						}
						sop.push(str[i]);
					}
				}
				i += 1;
				tmpa = 0;
			}
			else{
				tmpa = tmpa * 10 + (int)(str[i] - '0');
//				printf("%lf\n", tmpa);
			}
		}
		snum.push(tmpa);
		//做最后的处理
		while(!sop.empty()){
			tmpa = snum.top();
			snum.pop();
			tmp = sop.top();
			sop.pop();
			tmpb = snum.top();
			snum.pop();
//			printf("%c\n", tmp);
			switch(tmp){
			case '+':
				res = tmpb + tmpa;
//				printf("+%lf\n", tmpa);
				snum.push(res);
				break;
			case '-':
				res = tmpb - tmpa;
				snum.push(res);
				break;
			case '*':
				res = tmpb * tmpa;
				snum.push(res);
				break;
			case '/':
				res = tmpb*1.0/tmpa;
				snum.push(res);
				break;
			}
		}

		printf("%.2lf\n", snum.top());
		snum.pop();
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值