#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. 从Insider计划看Win10的发展

    Windows 10 Insider计划是微软为了更好的倾听用户的需求而推出的用户测试项目,参与该项目的 Insider可以免费使用Windows 10 预览版.同时这些用户还需要对 Windows ...

  2. "System.Security.Cryptography.CryptographicException: 拒绝访问" 问题的解决方法

    .net web程序使用rsa算法进行加解密时,程序报告“System.Security.Cryptography.CryptographicException: 拒绝访问”错.按网上搜的解决方法做了 ...

  3. 墙裂推荐4款js网页烟花特效

    以下是几款网页特效和一款软件: http://keleyi.com/keleyi/phtml/jstexiao/1.htm  http://keleyi.com/keleyi/phtml/jstexi ...

  4. java实现双链表(差点没写吐系列...)

    刚才把单链表写完了,现在又把双链表写了,双链表和单链表的区别就是每个节点有prior和next两个指针,不同于单链表的一个next指针,而且,正是因为有这两个指针,所以双链表可以前后两个方向去移动指针 ...

  5. 2、ASP.NET MVC入门到精通——Entity Framework入门

    实体框架(Entity Framework)简介 简称EF 与ADO.NET关系 ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R ...

  6. 适应手机端的jQuery图片滑块动画DEMO演示

    在线预览 下载地址 实例代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "htt ...

  7. CSS实现弹出导航菜单

    查看实际效果:http://keleyi.com/a/bjac/vksd7321.htm 完整代码,保存在html文件打开也可看到效果: <!DOCTYPE html PUBLIC " ...

  8. qq空间返回顶部代码

    点击这里体验效果 以下是源代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...

  9. jquery.datatable.js与CI整合 异步加载(大数据量处理)

    http://blog.csdn.net/kingsix7/article/details/38928685 1.CI 控制器添加方法 $this->show_fields_array=arra ...

  10. 解决JqueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug

    前些日子不是在做 使用Jquery-UI实现一次拖拽多个选中的元素操作嘛,在持续完善这个组件时遇到了一个关于拖放排序的bug.今天就着图片和代码重现一下,也顺便告诉大家如何解决这个问题. 首先先上图描 ...