C++:算术表达式求值

数据结构课程的题目,麻烦下各位高手 谢谢
支持运算函数:abs、sqrt、exp、ln、log10、sin、cos和tanh。
例如:输入一个表达式: 2*sqrt(16)-(-3+5)*(-5),得到运算结果18
下面给的两个都有错误,运行不了,我用的是VC++6.0

1/(1+1/(1+1/(x+y)));
x*(x*(x*(a*x+b)+c)+d)+e;
log(1+pow(fabs((a+b)/(a-b)),10));
sqrt(1+pi/2*cos(48));
1/tan((1-x*x)/(1+x*x));
//由于c语言中没提供cot函数,所以就用tan的倒数表示了。
log10(a*a+a*b+b*b);
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-12-09
这个可以用2个堆栈来实现,一个用来存放数字,一个用来存放符号,很麻烦的,原来写的代码丢失了,实在是懒得写了~~~~
第2个回答  2009-12-09
说实话,即使你出200分,对不会有人给你做!!!除非这个人已经做过!我们学完这个,我就知道有多么麻烦了……不说函数运算,单是括号匹配,加上后缀表达式就过你喝一壶的了……
第3个回答  2009-12-08
光加减乘除就能要人命了,这是我们编译原理课才做的东西。。
第4个回答  2009-12-16
刚刚做过,你自己也动手改下
有四个文件
//sqstack.h
#include <iostream>
#include <sstream>
using namespace std;
const int MAXSIZE=100;

template <typename ElemType>
struct SqStack{
ElemType base[MAXSIZE];
int top;
};

template <typename ElemType>
void initStack(SqStack<ElemType>& s){
s.top=0;
}

template <typename ElemType>
void clearStack(SqStack<ElemType>& s){
s.top=0;
}

template <typename ElemType>
bool isEmpty(SqStack<ElemType>& s){
return s.top==0;
}

template <typename ElemType>
bool isFull(SqStack<ElemType>& s){
return s.top==MAXSIZE;
}

template <typename ElemType>
ElemType peek(SqStack<ElemType>& s){
if(s.top==0){
cerr<<"Stack is empty!"<<endl;
exit(1);
}
return s.base[s.top-1];
}

template <typename ElemType>
void push(SqStack<ElemType>& s,const ElemType& e){
if(s.top==MAXSIZE){
cerr<<"Stack overflow!"<<endl;
exit(1);
}
s.base[s.top]=e;
++s.top;
}

template <typename ElemType>
ElemType pop(SqStack<ElemType>& s){
if(s.top==0){
cerr<<"Stack is empty!"<<endl;
exit(1);
}
--s.top;
ElemType temp=s.base[s.top];
return temp;
}
//change.cpp
#include "sqstack.h"

int precede(char op){
switch(op){
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '(':
case '@':
default:
return 0;
}
}

void change(char* s1,char* s2){
//将字符串s1中的中缀表达式转换为在于s2中的后缀表达式
SqStack<char> r;
initStack(r);//初始化栈
push(r,'@');//给栈底放入'@'字符,它具有最低优先级
int i,j;
i=0;
j=0;
char ch=s1[i];
while(ch!='@'){
if(ch==' ')
ch=s1[++i];
else if(ch=='('){
push(r,ch);
ch=s1[++i];
}
else if(ch==')'){
while(peek(r)!='(')
s2[j++]=pop(r);
pop(r);
ch=s1[++i];
}
else if(ch=='+'||ch=='-'||ch=='*'||ch=='/'){
char w=peek(r);
while(precede(w)>=precede(ch)){
s2[j++]=w;
pop(r);
w=peek(r);
}
push(r,ch);
ch=s1[++i];
}
else{
while(isdigit(ch)||ch=='.'){
s2[j++]=ch;
ch=s1[++i];
}
s2[j++]=' ';
}
}

ch=pop(r);
while(ch!='@'){
if(ch=='('){
cerr<<"expression error!"<<endl;
exit(1);
}
else{
s2[j++]=ch;
ch=pop(r);
}
}
s2[j++]='@';
s2[j++]='\0';
}
//compute.cpp
#include "sqstack.h"

double compute(char* str)
{
SqStack<double> s;
initStack(s);
istringstream ins(str); //把str定义为string流对象ins,P82
char ch; //用于输入字符
double x; //用于输入浮点数
ins>>ch;
while(ch!='@')
{
switch(ch){
case '+':
x=pop(s)+pop(s);
break;
case '-':
x=pop(s); //pop(s)弹出减数
x=pop(s)-x; //pop(s)弹出被减数
break;
case '*':
x=pop(s)*pop(s);
break;
case '/':
x=pop(s);
if(x!=0.0)
x=pop(s)/x;
else {cerr<<"Divide by 0!"<<endl;
exit(1);}
break;
default:
ins.putback(ch); //把ch重新回送到输入流中
ins>>x; //从字符串输入流中读入一个浮点数
}
push(s,x); //把读入的数或进行相应运算的结果压入到s栈中
ins>>ch;
}
if(!isEmpty(s)){
x=pop(s);
if(isEmpty(s))
return x;
else{
cerr<<"expression error!"<<endl;
exit(1);
}
}
else{
cerr<<"Stack is emppty!"<<endl;
exit(1);
}
}
//main.cpp

#include "sqstack.h"
int checkString(string strin)
{ //检查输入的表达式是否正确,包括括号是否配对

//若正确,返回值为1;否则返回0;

char st[MAXSIZE/2]; //存放括号的栈
int top=0, //栈顶
i;
for(i=0;strin[i]!='\0';i++)
{
//如果是左括号,则入栈
if(strin[i]=='(')
{ //如果是左括号,则入栈
top++;
st[top]=strin[i];
continue;
}

//小括号
if(strin[i]==')') //小括号
{
if(st[top]=='(') //配对
{
top--; //出栈
continue;
}
else return 0; //不配对,返回0
}

//运算符
if(strin[i]=='+' || strin[i]=='-' || strin[i]=='*' || strin[i]=='/')
{ //如果有连续运算符则错误
if(strin[i+1]=='+' || strin[i+1]=='-' || strin[i+1]=='*' ||strin[i+1]=='/')
return 0; //错误,返回0
else
continue; //无连续运算符情况
}

//数字、小数点、逗号
if(('0'<=strin[i] && strin[i]<='9') || strin[i]=='.'||strin[i]==',')
continue;

}

if(top!=0) //括号不匹配,返回0
return 0;
return 1;
}

int precede(char op);
void change(char* s1,char* s2);
double compute(char* str);

void main(){
cout<<"请输入表达式的个数\n(每个表达式以@结尾,表达式之间用空格隔开,最后以#号结尾):"<<endl;
char s1[1000];
cin.get(s1,1000,'#');
istringstream stri(s1);
for(int i=0;i<2;i++)
{
char ss[30],s2[30];
stri>>ss;
change(ss,s2);
cout<<ss<<endl;
if(!checkString(ss)) cout<<"表达式错误!";
double r=compute(s2);
cout<<r<<endl;

}
}
废话上面的值能用识别括号,其他的字母是一个一个的判断,你自己改下吧!
这里有更先进的代码
http://www.pudn.com/downloads11/sourcecode/others/detail44493.html
是有界面,你看的懂吗!
上面的程序也不看下,就直接运行,运行后也不看看,真怀疑是学了多少C++。

算数表达式求值c++
2. 运算数只考虑 0-9,这10个简单的数,方便从string中取出来 3. 输入的表达式没有语法错误 【背景知识】 中缀表示法(Infix expression):操作符位于两个操作数中间,算术表达式的常规表示法。只用于二元操作符的情况,而且需要用括号和优先规则排除多义性。(A+B)*C-D\/(E+F) 前缀表示法(Prefix expression):也叫...

c++算术表达式求值演示
将中缀表达式(1+2)*((8-2)\/(7-4))变成等价的后缀表达式:计算上述后缀表达式的值:自己看下,过程很详细,应该看得明白,代码你照着这个例子转化下就行了,希望对你有帮助。

c++表达式求值
\/*** 只适合整数的表达式求值 ***\/ \/***其中部分可作修改,表达式也可是输入的***\/ include "iostream.h"const int n0=30;int s1[n0+1]; \/\/操作数栈 char s2[n0+1]; \/\/运算符栈 int t1,t2;int num[4]; \/\/提取表达式中的整数 void calcu() \/\/一次计算 { int x1,x2,x;char ...

C++表达求值
include <stdio.h> include <conio.h> include <malloc.h> include <string.h> void main(){ int count = 0;printf("请输入表达式个数: ");scanf("%d", &count);float* presult = (float*)malloc(count*sizeof(float));char* pexpr = (char*)malloc(100*count);int i = 0;i...

(C++) 输入一个由数字、+、-、*、\/及括号组成的自述表达式,求其值。
typedef float SElemType_f;typedef char SElemType_ch;typedef int Status;include<iostream.h> include<stdlib.h> \/*free()头文件 *\/ define OK 1 define ERROR 0 typedef struct SqStack_f{ \/* 运算数栈 *\/ SElemType_f *base; \/* 在栈构造之前和销毁之后,base的值为NULL *\/ SEle...

...i=(x>100?10:100)的值和完成表达式求值后变量i的值分别是 和。_百...
先看书,查看语法规则,如果实在不明白就上机运行一下 这句可以换成这样的写法:x=625;if (x>100)i=10 else i=100 这样应该明白了吧 至于最终结果,看图吧。

c++实现四则运算的方法,是不是有一种将操作数和运算符分开存放,分开后...
一、中缀表达式。设置两个栈,一个存放运算符,另一个栈存放操作数。在进行表达式求值时,编译程序从左到右扫描,每遇到一个操作数,一律进入操作数栈,每遇到一个运算符,则应与运算符栈的栈顶进行比较,若运算符优先级高于栈顶的优先级,则进栈,否则在运算栈中退栈,退栈后,在操作数栈中退出两...

C++:编写一个程序能读入并计算一个只包含加减运算的表达式,每个输入的...
中缀转后缀表达式,然后对后缀表达式求值就可以了,这样不仅可以包含加减,还可以包含乘除括号、平方、开方等等

C语言关于表达式求值
这是我以前做的一个表达式求值的程序,要求和实现的功能是一样的:include<stdio.h> include <string.h> include <conio.h> define PLUS 0 define MINUS 1 define POWER 2 define DIVIDE 3 define LEFTP 4 define RIGHP 5 define STARTEND 6 define DIGIT 7 define POINT 8 define NUM 7 defi...

求问thinking in C++有几个版本有几卷
\/\/表达式求值算法,求出表达式结果\/*found=str.find_first_of("aeiou");while (found!=string::npos){ str[found]='*'; found=str.find_first_of("aeiou",found+1);}*\/int result(string s) \/\/吧表达式字符串导入{ \/\/首先清空栈,初始化 initialiseIStack(); initialiseCStack(); pushChar('#'); ...

相似回答