关于表达式计算问题
编写一个程序,其功能是:从键盘输入一个表达式字符串,其中包括数值子字符串以及+(加)、-(减)、*(乘)、/(除)四个运算符号与左右括号“(、)”;然后计算并输出该表达式的值。假设输入的表达式字符串总长度不超过60,且其中所包括的运算都是合法的(即在程序中不考虑不合法的运算)。例如,输入的表达式字符串为
1.5*(2.5+3.5)-(5.5-1)/3
输出结果为
1.5*(2.5+3.5)-(5.5-1)/3=7.5(计算结果)
要求结果的输出格式为
表达式字符串=计算结果
帮朋友要的,需要代码
问题点数:100、回复次数:8Top
1 楼skyfine(柳荣宏)回复于 2004-08-01 14:44:02 得分 5
一般的讲数据结构的书上都会有这样例子。看看书吧!Top
2 楼chon81(当我遇上你…)回复于 2004-08-01 14:48:06 得分 5
这个不是很像计算器.
上google去搜一下,很多啦.
写这个要懂得编译原理和一些数据结构(堆栈)Top
3 楼wansong(LostTemple)回复于 2004-08-01 14:53:50 得分 0
只要会入栈出栈就可以了Top
4 楼yk84(好人(专蹭百分贴))回复于 2004-08-01 19:50:54 得分 0
有例子代码吗??Top
5 楼JackyRao(一儿)回复于 2004-08-01 20:08:26 得分 5
先要定义运算符的优先级,在运用堆栈技术处理,详情请参阅《Pascal编程》国防科学技术大学出版社 姚廷宝教授等编写Top
6 楼baconbally(一屋不扫睡大觉)回复于 2004-08-01 20:24:30 得分 5
转化为后缀表达式
输出用一个宏Top
7 楼wansong(LostTemple)回复于 2004-08-01 22:09:43 得分 75
做了半天才做出来,都怪自己以前数据结构没怎么学好
这个程序支持double/int/float型数据的四则混合运算
且表达式的长度没有限制,支持表达式的合法性检测
#include <stack>
#include <iostream>
#include <string>
using namespace std;
char OP[10]={'+','-','*','/','(',')','#'};
//算符间的优先关系=====
int precede[7][7]={
1,1,2,2,2,1,1,
1,1,2,2,2,1,1,
1,1,1,1,2,1,1,
1,1,1,1,2,1,1,
2,2,2,2,2,3,0,
1,1,1,1,0,1,1,
2,2,2,2,2,0,3};
char Precede(char op,char c)//判断优先级
{
int pos_op;
int pos_c=7;
int i;
for(i=0;i<7;i++)
{
if(op==OP[i]) pos_op=i;
if(c==OP[i]) pos_c=i;
}
if(pos_c==7)
return '?';
switch(precede[pos_op][pos_c])
{
case 1:return '>';
case 2:return '<';
case 3:return '=';
}
}
void main()
{
stack<char> OPTR;//操作符栈
OPTR.push('#');
stack<double> OPND;//数据栈
cout<<"请输入表达式:";
string str;//用这个string来保存这个表达式.下面的数据也是从中分解而来
cin>>str;
str+="#";
double temp=0.0;
int dot=0;
string::iterator iter=str.begin();
while(*iter!='#' || OPTR.top()!='#')
{
//从string里面分解出double型数值=================
if('0'< *iter && *iter < '9')
{
if(dot==0)//判断小数点
{
temp=10.0*temp+(*iter-48);
iter++;
continue;
}
if(dot==1)
{
temp=temp+(*iter-48)/10.0;
iter++;
continue;
}
}
if(*iter=='.')//判断小数点
{
dot=1;
iter++;
continue;
}
dot=0;
if(temp!=0.0)
{
OPND.push(temp);
temp=0.0;
}
//判断优先级===============================
switch(Precede(OPTR.top(),*iter))
{
case '?':
cerr<<"输入表达式错误!";
return;
case '<':
OPTR.push(*iter);
iter++;
break;
case '=':
OPTR.pop();
iter++;
break;
case '>':
double left,right;
right = OPND.top();OPND.pop();
left = OPND.top();OPND.pop();
char theta;
theta=OPTR.top();OPTR.pop();
switch(theta)
{
case '+':OPND.push((left + right));break;
case '-':OPND.push((left - right));break;
case '*':OPND.push((left * right));break;
case '/':
if (right != 0)
{
OPND.push((left / right));
break;
}
else
return;
break;
}
}
}
//结果=====================================
iter=str.begin();
while(*iter!='#')
{
cout<<*iter;
iter++;
}
cout<<"="<<OPND.top()<<endl;
}Top
8 楼afxid()回复于 2004-08-01 22:50:08 得分 5
这个是NCRE变程大赛的复赛试题第4题啊Top




