以下是题的全部代码,如何补充并调试完成,就是用栈进行表达式求值,参考书籍数据结构(c语言版)
文件名:ExpressionFunc.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "ExpressionFunc.h"
////////////////////////
//表达式的项
struct SExpItem
{
int m_itemType;
int m_operatorType;//操作符类型
double m_itemValue;
};
////////////////////////
/*
功能:
初始化算术表达式
参数:
pExp:算术表达式
返回:
0:正确
其它:错误
*/
int ExpressionInit(struct SExpression *pExp)
{
if ( pExp==NULL )
return 200;
memset(pExp, 0x00, sizeof(struct SExpression)); //memset 对数组中每一个元素赋相同的值 memset(数组名,值,sizeof(数组名))
pExp->m_value = 0.0;//访问结构体有两种方法 一种是“ . ” 和“ -> ”操作
return 0;
}
/*
功能:
计算算术表达式的值
参数:
pExp:算术表达式
算术表达式由操作符、操作数组成
操作符:负-、加+、减-、乘*、除/、左括号(、右括号)
操作数:0--9和小数点组成的整数和小数
返回:
0:正确,算术表达式的值在pExp->m_value中
其它:错误
*/
int ExpressionEvaluate(struct SExpression *pExp)
{
while ( 1==1 )
{
//获取一个表达式项
//得到的是操作数:操作数处理
//得到的是操作符或结束符:操作符、结束符处理
} //while 1==1
return 100;
}
//////////////////////////
文件名:ExpressionMain.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ExpressionFunc.h"
char *g_validChars="0123456789.+-*/()";
int main()
{
struct SExpression exp;
int ret, ii, jj, nn, mm;//ret为表达式的值,ii为下标,nn为表达式的长度,jj为表达式中每个字符串的下标,mm为有效表达式的长度
while ( 1==1 )
{
// 20.6-5*(3.5-1.0)
// (3+2)*5-10.8
// (((-3.8)))
// (((3.2)))
// (((-3+5)))
// -3+5.7
// -3
// -(3+7.6)*6
// (3.5+2.5)*(3.5-2.5)
// 3*(-5-8)
// (-5-8)*3
// (2+3*3-1+4)
//scanf()不允许表达式中有空格
ExpressionInit(&exp);
printf("expression = ");
scanf("%s", exp.m_expStr);
//截断
exp.m_expStr[MAX_EXPRESSION_LENGTH-2]=0x00;
//结束程序?
nn=strlen(exp.m_expStr);
if ( nn<1 )
break;
if ( exp.m_expStr[0]=='#' )
break;
//检查非法字符
mm=strlen(g_validChars);
for ( ii=0; ii<nn; ii++ )
{
for ( jj=0; jj<mm; jj++ )
{
if ( exp.m_expStr[ii]==g_validChars[jj] )
break;
}
if ( jj>=mm )
{
printf("illegal char in expression\n");
break;
}
}
if ( ii<nn )
continue;
//表达式求值
ret = ExpressionEvaluate(&exp);
if ( ret!=0 )
printf("error = %d\n", ret);
else
printf("result = %lf\n", exp.m_value);
} //1==1
return 0;
}
///////////////////////////
文件名:ExpressionFunc.h
#ifndef __EXPRESSION_FUNC_H__
#define __EXPRESSION_FUNC_H__ 1
//表达式长度
#define MAX_EXPRESSION_LENGTH 256
//运算项类型
#define ITEM_TYPE_NONE 0 //无
#define ITEM_TYPE_OPERATOR 1 //操作符
#define ITEM_TYPE_OPERAND 2 //操作数
//操作符类型
#define OPERATOR_TYPE_NONE 0 //无
#define OPERATOR_TYPE_PLUS 1 //加
#define OPERATOR_TYPE_MINUS 2 //减
#define OPERATOR_TYPE_MULTIPLY 3 //乘
#define OPERATOR_TYPE_DIVIDE 4 //除
#define OPERATOR_TYPE_NEGATIVE 5 //负
#define OPERATOR_TYPE_LEFTP 6 //左括号
#define OPERATOR_TYPE_RIGHTP 7 //右括号
#define OPERATOR_TYPE_END 8 //结束
//最小除数
#define SAMLL_NUMBER 0.000000001
/////////////////////////////
//表达式
struct SExpression
{
//表达式字符串
char m_expStr[MAX_EXPRESSION_LENGTH];
double m_value;//值
//以下是可能的其它字段
//表达式长度
int m_expLen;
//表达式当前位置
int m_curPos;
//操作符堆栈
int m_operatorStack[MAX_EXPRESSION_LENGTH];
int m_operatorTop;
//操作数堆栈
double m_operandStack[MAX_EXPRESSION_LENGTH];
int m_operandTop;
};
/*
功能:
初始化算术表达式
参数:
pExp:算术表达式
返回:
0:正确
其它:错误
*/
int ExpressionInit(struct SExpression *pExp);
/*
功能:
计算算术表达式的值
参数:
pExp:算术表达式
算术表达式由操作符、操作数组成
操作符:负-、加+、减-、乘*、除/、左括号(、右括号)
操作数:0--9和小数点组成的整数和小数
返回:
0:正确,算术表达式的值在pExp->m_value中
其它:错误
*/
int ExpressionEvaluate(struct SExpression *pExp){
}
#endif
kihtoner
言曌博客liuyanzhao_com