支持+-*/()int 型数据的计算机c++实现
#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++实现的更多相关文章
- C++读写TXT文件中的string或者int型数据以及string流的用法
对文件的读写操作是我们在做项目时经常用到的,在网上看了很多博客,结合自身的项目经验总结了一下,因此写了这篇博客,有些地方可能直接从别的博客中复制过来,但是都会注明出处. 一.文件的输入输出 fstre ...
- (一)求 int 型数据在内存中存储时 1 的个数
题目:求 int 型数据在内存中存储时 1 的个数 描述:输入一个 int 型数据,计算出该 int 型数据在内存中存储时 1 的个数 运行时间限制: 10 sec 内存限制:128 MByte 输入 ...
- 求int型数组和最大子数组 续
之前的博文里已经实现过该程序的构思.编译.运行,本次就不再重复与之相雷同的内容. 题目:与别人借组,借助求int型数组最大和子数组的问题,考虑大数溢出和int取值范围的问题 要求: 调试程序 当子数 ...
- 华为笔试——C++的int型数字位排序
题目:int型数字位排序 题目介绍:输入int 型整数,按照从右至左的顺序,返回不含重复数字的新整数. 例: 输入: 99824270 输出: 072489 分析:乍一看很简单,但是很容易忽略int ...
- 将int型数字转换成6位字符串,不足的时候,前面补0
将int型数字转换成6位字符串,不足的时候,前面补0 方法一: int num = 123; num.ToString("000000"); 方法二: int num = 123; ...
- 华为机试 求int型数据在内存中存储时1的个数
题目描述 输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数. 输入描述: 输入一个整数(int类型) 输出描述: 这个数转换成2进制后,输出1的个数 输入 5 输出 2 普通运算方 ...
- 求int型数据在内存中存储时1的个数
1.求int型数据在内存中存储时1的个数 输入一个int型数据,计算出该int型数据在内存中存储时1的个数. 我们非常easy想到例如以下方法: #include <iostream> u ...
- php实现 求int型数据在内存中存储时1的个数(函数都可自己实现)
php实现 求int型数据在内存中存储时1的个数(函数都可自己实现) 一.总结 一句话总结:函数我们自己都可以实现,尤其是很多基础函数,没有工具的时候自己写. 1.php进制转换函数? base_co ...
- java如何把char型数据转换成int型数据(转)
一字符串,String=“2324234535”:把第i个数取出来时是char型的:char temp=String.charAt(i)如何把char型转换成int型?我需要求个尾数之和,如:123的 ...
随机推荐
- jQuery手机菜单
效果展示 http://hovertree.com/texiao/nav/4/ 手机扫描二维码查看效果: 源码下载 http://hovertree.com/h/bjaf/kroft6c7.htm ...
- C#之tcp自动更新程序
.NETTCP自动更新程序有如下几步骤: 第一步:服务端开启监听 ServiceHost host; private void button1_Click(object sender, EventAr ...
- Gym 100703I---Endeavor for perfection(尺取)
题目链接 http://codeforces.com/problemset/gymProblem/100703/I Description standard input/outputStatement ...
- Java的关键字与标识符
Java作为一门编程语言,与其他语言一样,有字符集.标识符.和关键字.变量.常量.语句等编程语言的基本要素. 1.关键字 abstract boolean break byte case catch ...
- android.view.InflateException: Binary XML file line #34: Error inflating class
问题一般出在xml的第三方View的全类名,你可能是直接粘贴过来的,没有改成自己项目的全类名.
- phpstorm10.0.3破解版安装教程及汉化方法
phpstorm是一个轻量级且便捷的PHP IDE,其旨在提供用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查.不但是php开发的利器,前端开发也是毫不逊色的.下面记录php ...
- 设计模式-装饰器模式(Decrator Model)
文 / vincentzh 原文连接:http://www.cnblogs.com/vincentzh/p/6057666.html 目录 1.概述 2.目的 3.结构组成 4.实现 5.总结 1.概 ...
- DrawSVG - SVG 路径动画 jQuery 插件
jQuery DrawSVG 使用了 jQuery 内置的动画引擎实现 SVG 路径动画,用到了 stroke-dasharray 和 stroke-dashoffset 属性.DrawSVG 是完全 ...
- jquery弹出下拉列表插件(实现kindeditor的@功能)
这几天有个工作需求,就是在富文本输入区域(kindeditor)可以有@功能,能够容易提示用户名的(像在qq群组@人一样).在网上找了一个叫bootstrap-suggest的插件,却不能满足我的需求 ...
- 自己写一个 jQuery 插件
我知道这一天终将会到来,现在,它来了. 需求 开发 SharePoint 的 CSOM 应用时,经常需要在网页上输出一些信息. 这种需求和 alert 的弹窗.F12 的断点查看信息的场景是不一样的: ...