150分求解简单问题!

fireseed 2002-03-17 11:59:12
/********************感谢关注*********************/
/////////////////////Creamdog//////////////////////


在VC++,给出一个表达式的字符串,如"(3+5)*2",我想计算出它的值,不考虑任何非法表达式问题。难道真的要想《数据结构》里说的那样,建两个栈.....我疯了!不知VC++里有没有简单易行的办法,请大伙给我一个可行的解决方案。
...全文
39 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
x_b_t 2002-03-18
  • 打赏
  • 举报
回复
一般是使用波兰表达示

或者呢使用JavaScript的com对象

因为jscript中有eval方法,可以根据一个字符串表示来求值

但不知道你对这些了解不了解,如果不了解,估计第二种方法对你来说也没多

大用处
zj945 2002-03-18
  • 打赏
  • 举报
回复
用STL里的类,有运算的模板<functional>
给你贴个MSDN的例子

Sample Code:

////////////////////////////////////////////////////////////////
//
// Compile options needed: none
//
// mathfunc.cpp - Illustrating the basic STL math
// functions.
//
// Structures: plus<A> - Adds data type A object to
// a class object derived from plus.
// minus<A> - Subtracts data type A.
// multiplies<A> - Multiplies object by data type A.
// divides<A> - Divides object by data type A.
// modulus<A> - Returns object modulo A.
/////////////////////////////////////////////////////////////////

#include <functional>
#include <iostream>

using namespace std ;

class MathOps : public plus<int>, public minus<int>,
public multiplies<int>, public divides<int>,
public modulus<int>
{
public:
int value;
MathOps(){value=0;}
MathOps(int x){value=x;}
result_type operator+(second_argument_type add2)
{return value + add2;}
result_type operator-(second_argument_type sub2)
{return value - sub2;}
result_type operator*(second_argument_type mult2)
{return value * mult2;}
result_type operator/(second_argument_type div2)
{return value / div2;}
result_type operator%(second_argument_type mod2)
{return value % mod2;}
friend ostream& operator<<(ostream& os, const MathOps& obj ) ;
};

ostream& operator<<(ostream& os, const MathOps& obj )
{
os << obj.value ;
return os ;
}

void main(void)
{
MathOps one,two,three,four,five,six;

cout << "Using MathOps class..." << endl ;

one = 18;
cout << "one = " << one << endl ;

two = one + 1;
cout << "two = one + 1 = " << two << endl ;

three = two - 2;
cout << "three = two - 2 = " << three << endl ;

four = three * 3;
cout << "four = three * 3 = " << four << endl ;

five = four / 4;
cout << "five = four / 4 = " << five << endl ;

six = five % 5;
cout << "six = five % 5 = " << six << endl ;
}


Program Output is:

Using MathOps class...
one = 18
two = one + 1 = 19
three = two - 2 = 17
four = three * 3 = 51
five = four / 4 = 12
six = five % 5 = 2

hooligan 2002-03-18
  • 打赏
  • 举报
回复
只能这样
strip 2002-03-18
  • 打赏
  • 举报
回复
逆波兰你不喜欢,还有我觉得更复杂的三元式,四元式,那些我就全还给老师了
fireseed 2002-03-18
  • 打赏
  • 举报
回复
to 大侠 阿飞:
只能这样吗??我欲哭无泪了......

Ps.《数据结构》(C语言版)严蔚敏 吴伟民编著 清华大学出版社出版 第一版 P52. 算法3.3 3.2.5表达式求值.....
strip 2002-03-18
  • 打赏
  • 举报
回复
数据结构讲这个吗? 不是编译原理吗???

如果是编译原理的话,应该是一个栈
比如先把表达式分析成逆波兰表达式,放在一个堆栈中
(3+5)*2
35+2*
1) 3,5,+ = 8, push 8
2) 8,2,* = 16
fireseed 2002-03-18
  • 打赏
  • 举报
回复
怎么只能给100分啊,我再开贴子给分,只要您能助我一臂之力,用数据库解决 = 无聊!

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧