游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2329|回复: 3

四则运算表达式计算器,支持嵌套()

[复制链接]

45

主题

157

帖子

169

积分

注册会员

Rank: 2

积分
169
QQ
发表于 2009-11-5 22:57:00 | 显示全部楼层 |阅读模式
//计算器
#include<iostream>
#include <sstream>  
#include<algorithm>  //STL通用算法
#include<string>  //字符串类
#include<vector>  //STL 动态数组容器

//字符串转换为数值
template <typename T>
T string_value( const std::string& str )
{
T value;
std::stringstream( str.c_str() ) >> value;
return value;
}
double calculator(const std::string& expression)
{
std::string s = expression;
double result = 0;
std::string strNumber="";
std::vector<double> nums;
std::vector<char> ops;
for(long i = 0; i < s.size(); ++i)
{
  switch(s)
  {
   case '(':
   {
    long count = 1;
    std::string::size_type p = i;
    for(;;)
    {
     p = s.find_first_of("()", p+1);
     if(std::string::npos==p)return 0; //左右括号不匹配
     if('('==s[p])++count;
     if(')'==s[p])--count;
     if(0==count)break;
    }
    if(')'!=s[p])return 0;
    nums.push_back(calculator(s.substr(i+1,p-i-1)));
    s.erase(s.begin()+i, s.begin()+p+1);
    --i;
    break;
   }
   case '*':
   case '/':
   case '+':
   case '-':
   {
    if(('-'==s && nums.empty())
     || ('-'==s && nums.size()==ops.size()))//处理负号
    {
     strNumber+="-";
     break;
    }
    else
    {
     if(!strNumber.empty())nums.push_back(string_value<double>(strNumber));
     ops.push_back(s);
     strNumber="";
     break;
    }  
   }
   case '0':
    if(!strNumber.empty())strNumber+='0';
    break;
   case '1':
   case '2':
   case '3':
   case '4':
   case '5':
   case '6':
   case '7':
   case '8':
   case '9':
   case '.':
    strNumber+=s;
    break;
   default:break;
  }
}
if(!strNumber.empty())nums.push_back(string_value<double>(strNumber));

std::cout<<"所有操作数:"<<std::ends;
std::copy(nums.begin(), nums.end(), std:stream_iterator<double, char>(std::cout, " "));
std::cout<<std::endl;
std::cout<<"所有运算符:"<<std::ends;
std::copy(ops.begin(), ops.end(), std::ostream_iterator<char, char>(std::cout, " "));
std::cout<<std::endl;

if(ops.size()+1!=nums.size())return 0;
for(i=0; i<ops.size();)
{
  switch(ops)
  {
   case '*':
   {
    nums *= nums[i+1];
    nums.erase(nums.begin()+i+1);
    ops.erase(ops.begin()+i);
    break;
   }
   case '/':
   {
    nums /= nums[i+1];
    nums.erase(nums.begin()+i+1);
    ops.erase(ops.begin()+i);
    break;
   }
   default: ++i;
  }
}

if(ops.size()+1!=nums.size())return 0;
i=0;
while(nums.size()>1)
{
  switch(ops)
  {
   case '+':
   {
    nums += nums[i+1];
    nums.erase(nums.begin()+i+1);
    ops.erase(ops.begin()+i);
    break;
   }
   case '-':
   {
    nums -= nums[i+1];
    nums.erase(nums.begin()+i+1);
    ops.erase(ops.begin()+i);
    break;
   }
  }
}

return nums[0];
}

int main()
{
std::cout<<calculator("-5*(5+1)/(-5)*(-2)")<<std::endl;
return 0;
}

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
发表于 2009-11-8 00:30:00 | 显示全部楼层

Re:四则运算表达式计算器,支持嵌套()

前一段时间正想做个这个东西呢~

1

主题

88

帖子

93

积分

注册会员

Rank: 2

积分
93
QQ
发表于 2009-11-8 08:55:00 | 显示全部楼层

Re:四则运算表达式计算器,支持嵌套()

弄得挺不错的

3

主题

17

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2009-11-12 10:57:00 | 显示全部楼层

Re: 四则运算表达式计算器,支持嵌套()


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-18 05:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表