(C++) 输入一个由数字、+、-、*、/及括号组成的自述表达式,求其值。

C++ 如题, 要正确的 答对加分。 谢谢!
简单的怎么不给了???

第1个回答  2010-07-01
////////////////////////////////////////////////////////////////////////////////////////////////////
//
//实验一:表达式求值
//文件名:stack.h
//文件功能:程序中栈的实现,这里是用链式存储
//时间:2009年4月10日
//
#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;

#define SIZE 100

template <class ElemType>
struct node
{
ElemType elem;
node *next;
};

////////////////////////////////////////////////////////////////////////////////
//
//定义栈
//
template <class ElemType>
class stack
{
private:
node <ElemType>*top; //头结点

public:

////////////////////////////////////////////////////////////////////////////////
//
//使用构造函数初始化
//
stack()
{
top = new node<ElemType>;
top->next = NULL;
top->elem = 0;
}
////////////////////////////////////////////////////////////////////////////////
//
//使用析构函数销栈
//
~stack()
{
node <ElemType>*p = this->top;

while (p->next != NULL)
{
top = p->next;
delete p;
p = top;
}
delete p;
}
////////////////////////////////////////////////////////////////////////////////
//
//压栈
//
void push(ElemType e)
{
node <ElemType>*p;

p = new node<ElemType>;
p->elem = e;
p->next = this->top->next;
this->top->next = p;
}
////////////////////////////////////////////////////////////////////////////////
//
//出栈
//
void pop(ElemType &e)
{
node <ElemType>*p;

if(!IsEmpty())
{
e = this->top->next->elem;
p = this->top->next;
this->top->next = p->next;
delete p;
}
}
////////////////////////////////////////////////////////////////////////////////
//
//得到栈顶元素
//
void GetTop(ElemType &e)
{
e = this->top->next->elem;
}
////////////////////////////////////////////////////////////////////////////////
//
//判断栈是否为空
//
bool IsEmpty(void)
{
if (this->top->next == NULL)
return true;
else
return false;
}
};

#endif // STACK_H_INCLUDED

//stack.h文件结束

////////////////////////////////////////////////////////////////////////////////////////////////////
//
//实验一:表达式求值
//文件名:ExpEvaluate.h
//文件功能:实现表达式的中缀转换成后缀,并且计算出结果
//时间:2009年4月10日
//
#ifndef EXPEVALUATE_H_INCLUDED
#define EXPEVALUATE_H_INCLUDED
#include "stack.h"

class expr
{
private:
char Exp[SIZE];
char PostExp[SIZE];
double _value;

public:
expr()
{
_value = 0;
for (int i=0; i<SIZE; i++)
{
Exp[i] = '\0';
PostExp[i]= '\0';
}
}

void init(void)
{
for (int i=0; i<SIZE; i++)
{
Exp[i] = '\0';
PostExp[i]= '\0';
}
}
////////////////////////////////////////////////////////////////////////////////
//
///得到该表达式计算后的结果
//
double GetValue(void)
{
return _value;
}
////////////////////////////////////////////////////////////////////////////////
//
///判断用户输入的表达式是否为合法的
//
bool IsLegal(char *a)
{
char temp[SIZE];
char test;
int length = strlen(a);
int left=0,right=0;
int isnumber=0, ischar=0;

if(length == 0)
{
cout<<"输入为空,请输入表达式!"<<endl;
return false;
}
for(int i=0; i<SIZE; i++)
temp[i] = '\0';
///////////////////////////////////////////////////////////////////
///过滤掉空格
for(int i=0,k=0; i<length; i++,k++)
{
test = a[i];
if(test == ' ')
{
k--;
continue;
}
temp[i] = test;
}
strcpy(a,temp);
length = strlen(a);
///////////////////////////////////////////////////////////////////
///长度不合法
for(int i=0; i<SIZE; i++)
temp[i] = '\0';
if(length > SIZE)
{
cout<<"存储空间不够!"<<endl;
exit(0);
}
///////////////////////////////////////////////////////////////////
///处理数字与括号间省略括号的情况
for(int j=0,k=0; j<length; j++,k++)
{
test = a[j];
if(test == '(')
if(j!=0)
if((a[j-1]>='0' && a[j-1]<='9') || a[j-1] == ')')
{
temp[k] = '*'; ///添上省略的括号
temp[k+1] = test;
k++;
continue;
}
temp[k] = test;
}
strcpy(a,temp);
length = strlen(a);
for(int i=0; i<SIZE; i++)
temp[i] = '\0';
///////////////////////////////////////////////////////////////////
///处理负数问题
for(int j=0,k=0; j<length; j++,k++)
{
test = a[j];
if(j==0 && test == '-')
{
temp[k] = '0'; ///第一个数是负数的时候,在最前面加一个负号
temp[k++]='-';
continue;
}
if(test == '(' && a[j+1] == '-')
{
temp[k] = '('; ///遇到加括号的负数时,在括号和负号之间添上一个0
temp[k+1] = '0';
temp[k+2] = '-';
k+=2;
j++;
continue;
}
temp[k] = test;
}
strcpy(a,temp);
length = strlen(a);
///////////////////////////////////////////////////////////////////
///判断有没有非法的字符
for(int m=0; m<length; m++)
{
test = a[m];
if(!(test=='+'||test=='-'||test=='*'||test=='/'||test=='^'||test=='('||test==')'||(test<='9'&&test>='0')||test=='.'))
{
cout<<"含有非法的字符!"<<endl;
return false;
}
}
///////////////////////////////////////////////////////////////////
///检测括号是否匹配
for(int m=0; m<length; m++)
{
test = a[m];
if(test == '(')
left++;
if(test == ')')
right++;
}
if(left != right)
{
cout<<"括号不匹配!"<<endl;
return false;
}
///////////////////////////////////////////////////////////////////
///判断表达式的一些数字与符号的错误
for(int p=0; p<length; p++)
{
test = a[p];
///////////////////////////////////////////////////////////////////
///判断小数的非法
if(test=='.')
{
if(p==0 || p==length-1)
{
cout<<"小数点有错误!"<<endl;
return false;
}
if((a[p+1]>'9' && a[p+1]<'0') || (a[p-1]>'9' && a[p-1]<'0'))
{
cout<<"小数点有错误!"<<endl;
return false;
}
}
///////////////////////////////////////////////////////////////////
///判断运算符和数字的数量是否合法
if((test<='9'&&test>='0') || test=='.')
{
while(test<='9'&&test>='0' || test== '.')
{
test = a[++p];
}
isnumber++;
p--;
continue;
}
if(test=='+'||test=='-'||test=='*'||test=='/'||test=='^')
{
ischar++;
continue;
}
}
///符号数量少
if(isnumber > ischar+1)
{
cout<<"缺少符号!"<<endl;
return false;
}
///数字数量少
if(isnumber < ischar+1)
{
cout<<"缺少数字!"<<endl;
return false;
}
return true;
}
////////////////////////////////////////////////////////////////////////////////
//
///使用提供的字符串来设置表达式前缀的值
//
bool SetExp(char* a)
{
if (IsLegal(a))
{
strcpy(Exp, a);
return true;
}
else
cout<<"输入的表达式不合法!请重新输入!"<<endl;
return false;
}
////////////////////////////////////////////////////////////////////////////////
//
///将表达式前缀转换为后缀,这里优先级已经体现在程序中,没有另外建立判断函数
//
void translate(void)
{
stack <char>oprate;
char temp = *Exp;
char Top;
char elem;
int j=0;

for (int i=0; temp != '\0'; i++)
{
temp = *(Exp+i);
switch (temp)
{
case '(': ///遇左括号进栈
oprate.push(temp);
break;
case ')':
if (!oprate.IsEmpty()) ///遇右括号一直出栈直到栈顶为左括号,并且将左括号删除
{
oprate.GetTop(Top);
while (Top != '(')
{
oprate.pop(elem);
PostExp[j++] = elem;
if (!oprate.IsEmpty())
oprate.GetTop(Top);
else
break;
}

oprate.pop(elem);
}
break;
case '+':
case '-': ///遇加减号优先级相同,可以一同处理
if (!oprate.IsEmpty())
{
oprate.GetTop(Top);
while (Top != '(')
{
oprate.pop(elem);
PostExp[j++] = elem;
if (!oprate.IsEmpty())
oprate.GetTop(Top);
else
break;
}
}
oprate.push(temp);
break;
case '^':
if (!oprate.IsEmpty())
{
oprate.GetTop(Top);
while (Top=='^') ///优先级最高
{
oprate.pop(elem);
PostExp[j++] = elem;
if (!oprate.IsEmpty())
oprate.GetTop(Top);
else
break;
}
}
oprate.push(temp);
break;
case '*':
case '/': ///乘除法优先级也是相同的
if (!oprate.IsEmpty())
{
oprate.GetTop(Top);
while (Top=='*' || Top=='/' || Top=='^')
{
oprate.pop(elem);
PostExp[j++] = elem;
if (!oprate.IsEmpty())
oprate.GetTop(Top);
else
break;
}
}
oprate.push(temp);
break;
case ' ': ///过滤空格
break;
default: ///处理数字,并以#号作为数字结束符号
while ((temp>='0' && temp<='9') || temp=='.')
{
PostExp[j++] = temp;
i++;
temp = *(Exp+i);
}
i--;
PostExp[j++] = '#';
break;
}
}

while (!oprate.IsEmpty())
{
oprate.pop(elem);
PostExp[j++] = elem;
}
PostExp[j] = '\0';
}
////////////////////////////////////////////////////////////////////////////////
//
///计算后缀表达式的值
//
bool ComputeValue(void)
{
stack <double>number;
char temp = *PostExp; ///用来暂存字符
double one=0, two=0, value=0; ///运算的数和结果
double date = 0, ispoint = 0;
int count=0;
int length = strlen(PostExp); ///后缀表达式的长度

for (int i=0; i<length; i++)
{
temp = *(PostExp+i);

switch (temp)
{
case '+': ///遇到加号将数字出栈,进行运算
one = 0;
two = 0;
value = 0;
number.pop(one);
number.pop(two);
value = one + two;
number.push(value);
break;
case '-': ///遇到号将数字出栈,进行运算
one = 0;
two = 0;
value = 0;
number.pop(one);
number.pop(two);
value = two - one;
number.push(value);
break;
case '*': ///计算乘号
one = 0;
two = 0;
value = 0;
number.pop(one);
number.pop(two);
value = two * one;
number.push(value);
break;
case '/': ///计算除号
one = 0;
two = 0;
value = 0;
number.pop(one);
number.pop(two);
if (one != 0)
value = two / one;
else
{
cout<<"除零错误!退出"<<endl; /// 除数为零计算失败
return false;
}
number.push(value);
break;
case '^': ///计算指数
one = 0;
two = 1;
value = 0;
number.pop(one);
number.pop(two);
if (two > 0)
value = pow(two, one);
else
{
cout<<"错误!退出"<<endl;
exit(0);
}
number.push(value);
break;
default:
if (temp != '#')
{
date = 0;
ispoint = 0;
count = 0;
///////////////////////////////////////////////////////////////////////////////
///将字符串的数字转换为数可以用库函数,这里自己编写的
while ((temp>='0' && temp <='9') || temp=='.')
{
if(temp == '.') ///遇到小数点然后后面的数字计算方式会改变
{
ispoint = 1;
i++;
temp = *(PostExp+i);
continue;
}
if (ispoint==0)
{
date=date*10+temp-'0';
}
else
{
count++;
date += (temp-'0')*pow(0.1,count);
}
i++;
temp = *(PostExp+i);
}
i--;
number.push(date);
}
}
}
number.pop(_value);
return true;
}
////////////////////////////////////////////////////////////////////////////////
//
///将表达式的中缀式和后缀式以及最终的结果打印输出
//
void Display(void)
{
cout<<"中缀表达式为:"<<Exp<<endl;
cout<<"后缀表达式为:"<<PostExp<<endl;
}
};

#endif // EXPEVALUATE_H_INCLUDED
////////////////////////////////////////////////////////////////////////////////////////////////////
//
//实验一:表达式求值
//文件名:main.cpp
//文件功能:程序主函数
//时间:2009年4月10日

#include "ExpEvaluate.h"
#include "stack.h"

using namespace std;

int main()
{
expr test_expr; //表达式类的实例
char Expr[SIZE];
double value;
char _Exit;

while(1)
{
test_expr.init();
cout<<"输入计算的表达式:"<<endl;
cin.getline(Expr,SIZE);
if(!test_expr.SetExp(Expr))
continue;
test_expr.translate(); //中缀转换为前缀
test_expr.Display();
test_expr.ComputeValue(); //计算,结果送value
value = test_expr.GetValue();
cout<<"计算结果为:"<<value<<endl;
cout<<"计算结束,是否继续(是Y,否N):"<<endl;
cin>>_Exit;
cin.get();
if(_Exit != 'Y' && _Exit != 'y')
return 0;
}
return 0;
}

(C++) 输入一个由数字、+、-、*、\/及括号组成的自述表达式,求其值。
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 *\/ SElemType_f *top; \/* 栈...

C++输入表达式,求值
法运算符“*”,且没有括号,所有参与运算的数字均为 0 到 2^31-1 之间的整数。输入数据保 证这一行只有 0~ 9、+、*这 12 种字符。输出格式:输出只有一行,包含一个整数,表示这个表达式的值。注意:当答案长度多于 4 位时,请只输出最后 4 位,前导 0 不输出。include <iostream>#includ...

用c++做一个四则运算计算器(支持加减乘除混合运算,支持括号,倒数,正负...
op.pop(); } } return dealNum(num1, num2, op1);}int main() { while (1) { \/\/循环输入,结束直接关闭即可 string my; cout << "输入算式: " << endl; getline(cin, my); dealString(my); cout << "结果为: " << cal() << endl << endl; }}———版...

C++表达求值
printf("请输入表达式%d: ", i);scanf("%s", pexpr + 101*i);char* p = pexpr + 101*i;float paramA = 0;float paramB = 0;char opertmp = ' ';char oper = ' ';while(1){ int ret = sscanf(p, "%f%c", ¶mB, &opertmp);p = strchr(p, opertmp) + 1;if ...

C或C++高手进从1到13中任选4个数,运用+,-,*,\/,()使其最后的值为24,这...
如( ( ( 1 + 2 ) + 3 ) * 4 ) = 24 和 ( ( 1 + ( 2 + 3 ) ) * 4 ) = 24去掉不必要的括号和,都能化成:(1 + 2 + 3 )*4 = 24 ,因此一般我们认为上面这两个式子是相同的。 *\/#include <iostream>#include <cstring>#include <cmath>#include <string>#include <ctime>#include...

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

...读入并计算一个只包含加减运算的表达式,每个输入的数据都是浮点数...
中缀转后缀表达式,然后对后缀表达式求值就可以了,这样不仅可以包含加减,还可以包含乘除括号、平方、开方等等

输入一个带有括号的四则运算的算式,以#结束,输出该算式结果(用c++实现...
_tag;va_list list;va_start(list, _tag);if (tag == true)v.va = va_arg(list, double);else v.op = va_arg(list, int);}};double calc(char *s){stack<vas> temp;stack<vas> res;char c;double v1, v2;while ((c = *s) != '#'){if ((c <= '9'&&c >= '...

C语言 在一个数组或指针里有一个算式(字符串),如何对它求值?
如果当前元素是右括号")"则栈顶元素依此出栈,直至与它匹配的左括号"("出栈为止。对后缀表达式进行计算原理是这样的:对后缀表达式由左往右方向进行扫描,遇到数字则进栈,遇到运算符号则在栈里依此出栈两组数字进行计算,计算结果依然进栈,反复此操作。最后栈底部最后一个元素就是该表达式的运算结果。

如何用C++编写个程序中缀表达式变成后缀表达式,并用后缀表达式求值
cout<<"括号没有配对!"<<endl; goto start; } } if(strcmp(str,"exit")==0) break; \/\/如果输入的是exit就退出 unsigned int temp=strlen(str),k=0; \/\/把原始算式的长度存在temp里,标记k指向第一个字符 if(isdigit(str[0])) s='n'; else s='s'; \/\/判断第一个字符是数字还是符号 for...

相似回答