#include <iostream>
#include<sstream>
using namespace std;
template<typename T>
class stack
{
T p[];
int toop;
public:
stack() { toop = -; }
void push(T t) { toop++; p[toop] = t; }
T top() { return p[toop]; }
bool empty() { if (toop == -)return true; return false; }
void pop() { toop--; }
};
class caculator
{
string s;//原波兰式的容器
stack<char>op;
stack<float>num;
stringstream ss;//用于转换的流
stringstream sb;//插入逆波兰式的流
string str;//存放数字的容器,每次更新
string strs;//存放逆波兰式的容器
float x, y;
public:
caculator(char *p) { s = p; }
float trans(const char *p);
float antipoland();
void show() { cout << strs; }
void readnum();
void caucEveTime();
void shownum() { while (!num.empty()) { cout << num.top() << endl; num.pop(); } }
void showop() { while (!op.empty()) { cout << op.top() << endl; op.pop(); } }
};
float caculator::trans(const char *p)//底层const,对象为常量
{
float n;
n = *p - '\0' - ;//确保转化成int后数值不变
int i = strlen(p);
while (--i)
{
*p++;
n = n * + (*p - '\0' - );
}
return n;
}
void caculator::readnum()
{
str = ss.str();
if (!str.empty())//str中存放数字串
{
ss.str("");//清空流
num.push(trans(str.c_str()));
}
}
void caculator::caucEveTime()//由符号栈弹出符号决定调用
{
y = num.top();
num.pop();
x = num.top();
num.pop();
switch (op.top())
{
case'+':num.push(x + y); break;
case'-':num.push(x - y); break;
case'*':num.push(x*y); break;
case'/':num.push(x / y); break;
default:break;
}
}
float caculator::antipoland()
{
for (int i = ; i < s.size(); i++)
switch (s[i])
{
case '(':op.push(s[i]);readnum(); break;
case '+':
case '-':
readnum();
if (op.top() == '(')
op.push(s[i]);
else if(op.empty())
op.push(s[i]);
else
{
while (!op.empty())
{
if (op.top() != '('&&op.top() != ')')
{
sb << op.top();
caucEveTime();
}
op.pop();
}
op.push(s[i]);
}
break;
case ')':
readnum();
while (op.top() != '(')
{
sb << op.top();
caucEveTime();
op.pop();
}op.pop(); break;
case '*':
case'/':
readnum();
while (op.top() == '*' || op.top() == '/')
{
sb << op.top();
caucEveTime();
op.pop();
}op.push(s[i]); break;
default:
sb << s[i];
ss <<s[i];
break;
}
str = ss.str();
num.push(trans(str.c_str()));
while (!op.empty())
{
if (op.top() != '('&&op.top() != ')')
{
sb<< op.top();
caucEveTime();
}
op.pop();
} strs = sb.str();
return num.top();
}
void main()
{
char ch[];
char *p=ch;
cin >> p;
caculator a(p);
//a.antipoland();//两次重复调用改变数字栈中的数字!
// a.show();
cout <<"="<<a.antipoland()<<endl;
// cout << endl;
//a.shownum();
//a.showop();
}

支持+-*/()int 型数据的计算机c++实现的更多相关文章

  1. C++读写TXT文件中的string或者int型数据以及string流的用法

    对文件的读写操作是我们在做项目时经常用到的,在网上看了很多博客,结合自身的项目经验总结了一下,因此写了这篇博客,有些地方可能直接从别的博客中复制过来,但是都会注明出处. 一.文件的输入输出 fstre ...

  2. (一)求 int 型数据在内存中存储时 1 的个数

    题目:求 int 型数据在内存中存储时 1 的个数 描述:输入一个 int 型数据,计算出该 int 型数据在内存中存储时 1 的个数 运行时间限制: 10 sec 内存限制:128 MByte 输入 ...

  3. 求int型数组和最大子数组 续

    之前的博文里已经实现过该程序的构思.编译.运行,本次就不再重复与之相雷同的内容. 题目:与别人借组,借助求int型数组最大和子数组的问题,考虑大数溢出和int取值范围的问题 要求: 调试程序  当子数 ...

  4. 华为笔试——C++的int型数字位排序

    题目:int型数字位排序 题目介绍:输入int 型整数,按照从右至左的顺序,返回不含重复数字的新整数. 例: 输入: 99824270 输出: 072489 分析:乍一看很简单,但是很容易忽略int ...

  5. 将int型数字转换成6位字符串,不足的时候,前面补0

    将int型数字转换成6位字符串,不足的时候,前面补0 方法一: int num = 123; num.ToString("000000"); 方法二: int num = 123; ...

  6. 华为机试 求int型数据在内存中存储时1的个数

    题目描述 输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数. 输入描述: 输入一个整数(int类型) 输出描述: 这个数转换成2进制后,输出1的个数 输入 5 输出 2 普通运算方 ...

  7. 求int型数据在内存中存储时1的个数

    1.求int型数据在内存中存储时1的个数 输入一个int型数据,计算出该int型数据在内存中存储时1的个数. 我们非常easy想到例如以下方法: #include <iostream> u ...

  8. php实现 求int型数据在内存中存储时1的个数(函数都可自己实现)

    php实现 求int型数据在内存中存储时1的个数(函数都可自己实现) 一.总结 一句话总结:函数我们自己都可以实现,尤其是很多基础函数,没有工具的时候自己写. 1.php进制转换函数? base_co ...

  9. java如何把char型数据转换成int型数据(转)

    一字符串,String=“2324234535”:把第i个数取出来时是char型的:char temp=String.charAt(i)如何把char型转换成int型?我需要求个尾数之和,如:123的 ...

随机推荐

  1. Win10 UWP系列:更新UWP时注意的问题——TargetDeviceFamily

    前几天把CurrencyExchanger提交到微软参加Master认证,结果没有通过,反馈了一些错误,看来微软检查还是比较仔细的. 错误主要有: Visual feedback helps user ...

  2. HtmlHelper拓展实现CheckBoxList

    经过一番折腾(主要是SelectList这个类操作有些繁琐)实现了CheckBoxList,过程RadioList基本一样 拓展方法 public static MvcHtmlString Check ...

  3. jQuery弹出深色系层菜单

    低调奢华jQuery弹出层菜单,使用新版的jQuery库,兼容多种浏览器.Demo展示: http://hovertree.com/texiao/layer/3/ 本特效可以作为网站的引导页,使用jQ ...

  4. Java程序,基本数据类型、、数据类型转换、变量和常量、常用运算符

    一.基本数据类型 整数类型:byte.short. int(常用).long(较常用)     定义某个变量          int  a=10: 浮点类型(小数):float.double(常用) ...

  5. GridView嵌套在ScrollView里只有一行的问题

    遇到这个问题 网上找到的解决办法: 方法一:就是上面说的通过计算出来ListView或者GridView中的子列高度和 进行显示:public void setListViewHeightBasedO ...

  6. 【英语学习】2016.09.11 Culture Insider: Teacher's Day in ancient China

      Culture Insider: Teacher's Day in ancient China 2016-09-10 CHINADAILY Today is the 32nd Chinese Te ...

  7. 解决服务器SID引起虚拟机不能加入AD域用户,无法远程登录的问题

    最近在公司搭建AD域控制器,发现无法在计算机真正添加域用户,也就是添加的用户虽然可以在本地登录,但是无法远程登录,尝试多种方法都无法解决,而最终原因居然是虚拟机导致的服务器的SID冲突.本文记录下该问 ...

  8. 怎么在MVC中使用自定义Membership

    首先我们来看看微软自带的membership: 我们打开系统下aspnet_regsql.exe 地址一般位于: C:\WINDOWS\Microsoft.NET\Framework\v2.0.507 ...

  9. javascript类型系统——正则表达式RegExp类型

    × 目录 [1]对象 [2]实例属性 [3]静态属性[4]实例方法 前面的话 前面已经介绍过javascript中正则表达式的基础语法.javascript的RegExp类表示正则表达式,String ...

  10. [JS]笔记13之Date对象

    -->获取与设置时间的方法-->使用Date对象制作相应的效果 1.设置时间创建一个时间对象 new Date(time); 设置时间 time 从1970年1月1日至几种格式:new D ...