#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. C#基础知识三之new关键字

    运算符 new一个Class时,new完成了两方面内容:一是调用new class命令来为实例在托管堆中分配内存;二是调用构造函数来实现对象初始化. 修饰符 显示隐藏从基类继承来的成员.虽然可以不用n ...

  2. 设计模式(一)单例模式(Singleton Pattern)

    一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设计模式>,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了 ...

  3. ul li设置横排,并除去li前的圆点

    效果预览:http://hovertree.com/texiao/css/ 如何用CSS制作横向菜单 让ul li横向排列及圆点处理 我们先建立一个无序列表,来建立菜单的结构.代码是: <ul& ...

  4. 谈一谈SQL Server中的执行计划缓存(上)

    简介 我们平时所写的SQL语句本质只是获取数据的逻辑,而不是获取数据的物理路径.当我们写的SQL语句传到SQL Server的时候,查询分析器会将语句依次进行解析(Parse).绑定(Bind).查询 ...

  5. PHP四个阶段目标以及第一阶段学习内容

    PHP课程体系主要分为四个阶段,第一阶段讲的是网页HTML和数据库MySQL,第一阶段要学会网页制作的基础知识,熟用各种基本标签,对数据库进行操作,各项考核都能够达标,拿出出众的项目展示. 在第二个阶 ...

  6. Android实现播放器功能

    package com.example.yzj.android_7_27; import android.content.ContentResolver;import android.content. ...

  7. 工业串口和网络软件通讯平台(SuperIO 2.0)发布

    下载:SuperIO 2.0(开发手册.Demo.组件包) 官网:进入 交流群:54256083 SuperIO 2.0版本正式发布.把SCL正式更改名称为SuperIO. 一.此次升级主要包括两个方 ...

  8. 《Effective C#》读书笔记

    Effiective C# Item1 : 使用属性代替成员变量 Effective C# Item2:运行时常量(readonly)优于编译时常量(const) Effective C# Item3 ...

  9. BUTTONS V. 2.0.0——CSS按钮库

    BUTTONS-V2-CSS库样式职责 CSS库样式职责分离优点 模块样式命名更清晰化 易于维护.扩展性强 动画效果——修改样式后有过度效果,默认样式 源码如下 <!DOCTYPE html&g ...

  10. Google LOGO现代舞舞蹈动画

    效果预览:http://hovertree.com/texiao/js/5.htm 截图: HTML文件代码: <!DOCTYPE html> <html xmlns="h ...