当前位置: 首页 > news >正文

数字操作符九度OJ 1019 简单计算器

PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘。目前又不当COO,还是得用心记代码哦!

    题目链接: http://ac.jobdu.com/problem.php?pid=1019

    

    题目分析:

    应用两个栈,一个存储数字数据,一个存储操纵符号。判断*和/的时候,不入栈,直接通过判断盘算前后数字乘除法操纵后的值,次序入数字栈。操纵符栈最后只存储+和-符号。

    都入栈完毕以后,由于是中缀表达式盘算,盘算次序从左至右,这就需要将栈中数据逆置,采用导出到数组的方法。导出完毕后,依次从左至右开始盘算,即可处理。

    

    源代码:

    每日一道理
人生是洁白的画纸,我们每个人就是手握各色笔的画师;人生也是一条看不到尽头的长路,我们每个人则是人生道路的远足者;人生还像是一块神奇的土地,我们每个人则是手握农具的耕耘者;但人生更像一本难懂的书,我们每个人则是孜孜不倦的读书郎。
#include <iostream>
#include <iomanip>
#include <stack>
#include <stdlib.h>
#include <stdio.h>

using namespace std;

int main()
{
	stack<double> SD;	//数字栈
	stack<char> SO;		//操纵符栈
	double left, right;	//退栈时存储栈头数字
	int num;	//输入数字
	char op;	//输入操纵符
	double data[1000];	//数字数组
	char operate[1000];	//操纵符数组

	while (cin>>num)	//读入开始数字
	{
		op = getchar();	//读取数字后输入的字符
		if (num == 0 && op == '\n')	//输入0后,退出
		{
			break;
		}
		SD.push(num);
		while (op == ' ')	//数字后要跟空格
		{
			op = getchar();	//读取空格后的操纵符
			if (op == '\n')	//输入回车后,程序结束
			{
				break;
			}
			if (!SO.empty() && (SO.top() == '*' || SO.top() == '/'))
			{
				right = SD.top();
				SD.pop();
				left = SD.top();
				SD.pop();
				if (SO.top() == '*')
				{
					SD.push(left * right);
				}
				if (SO.top() == '/')
				{
					SD.push(left / right);
				}
				SO.pop();
			}
			SO.push(op);
			cin>>num;
			SD.push(num);
			op = getchar();	//下一轮循环判断

		}
		if (SO.top() == '*' || SO.top() == '/')
		{
			right = SD.top();
			SD.pop();
			left = SD.top();
			SD.pop();
			if (SO.top() == '*')
			{
				SD.push(left * right);
			}
			else if (SO.top() == '/')
			{
				SD.push(left / right);
			}
			SO.pop();
		}
	

		//将堆栈数据保存到保存到数组中,从左向右盘算
		int i = 0;
		int oplength, datalength;	//栈内数据长度
		int optop, datatop;
		while (!SO.empty())
		{
			operate[i++] = SO.top();
			SO.pop();
		}
		oplength = i;
		optop = i - 1;
		i = 0;
		while (!SD.empty())
		{
			data[i++] = SD.top();
			SD.pop();			
		}
		datalength = i;
		datatop = i - 1;

		for (int j = optop; j >= 0; j--)
		{
			if (operate[j] == '+')
			{
				data[datatop - 1] = data[datatop] + data[datatop - 1];
				datatop --;
			}
			else if (operate[j] == '-')
			{
				data[datatop - 1] = data[datatop] - data[datatop - 1];
				datatop --;
			}
		}
		
		cout.setf(ios::fixed);
		cout<<setprecision(2)<<data[0]<<endl;
	}
	return 0;

}

文章结束给大家分享下程序员的一些笑话语录: 乔布斯:怎么样还是咱安全吧!黑客:你的浏览器支持国内网银吗?苹果可以玩国内的网游吗乔布斯:......不可以黑客:那我研究你的漏洞干嘛,我也需要买奶粉!

转载于:https://www.cnblogs.com/jiangu66/archive/2013/05/17/3084515.html

相关文章:

  • NO1 ip-systemctl-fdisk
  • 执行对象cocos2d-x 2.x action动作整理集合
  • MySQL主从复制介绍
  • C# 使用GDI+绘制漂亮的ToolStrip和StatusStrip皮肤(转载)
  • Win32编程点滴3 - 简单ActiveX控件的使用
  • 禁止鼠标选中文字
  • HDU2553 N皇后问题
  • [转]给年轻工程师的十大忠告
  • Flutter 安装
  • CYQ.Data V5 批量插入与批量更新示例
  • Java知识点总结(JavaIO-打印流)
  • 在Java中使用Lua脚本语言
  • python正则
  • [HEOI2013]ALO
  • 20172304 2017-2018-2 《程序设计与数据结构》第七周学习总结
  • [Vue CLI 3] 配置解析之 css.extract
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • Git同步原始仓库到Fork仓库中
  • Less 日常用法
  • Objective-C 中关联引用的概念
  • Promise面试题,控制异步流程
  • tweak 支持第三方库
  • vue-cli在webpack的配置文件探究
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 全栈开发——Linux
  • 如何利用MongoDB打造TOP榜小程序
  • 三栏布局总结
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 详解NodeJs流之一
  • 小程序01:wepy框架整合iview webapp UI
  • 用 Swift 编写面向协议的视图
  • 智能合约开发环境搭建及Hello World合约
  • 主流的CSS水平和垂直居中技术大全
  • ​Spring Boot 分片上传文件
  • ​用户画像从0到100的构建思路
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (2)MFC+openGL单文档框架glFrame
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (论文阅读30/100)Convolutional Pose Machines
  • (三)Honghu Cloud云架构一定时调度平台
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)EXC_BREAKPOINT僵尸错误
  • ******IT公司面试题汇总+优秀技术博客汇总
  • ****Linux下Mysql的安装和配置
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .net 生成二级域名