我很佩服你,或许又有人认为我蠢,连这都想不到。
但是还是认为想到树来解决问题是个最明智的选择。
" target="_blank">[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
以下程序是前一断时间根据严蔚敏的《数据结构》基于栈的算法自己写的一个四则运算的小程序
其中的MyList是自己写的一个链表模板类,实现了简单的栈和队列操作。程序里面也有bug还没解决
比如说算式开始为负数在运算时就会出错,而且也没优化性能。这里贴出来一是希望高手们斧正,二就是抛砖引玉了。
#include "mylist.h" //所有的头文件都包含在里面了
//比较运算符优先级函数
int compareOper(char cOpBack, char cOpFront);
//判断是否运算符函数
int isOperator(char cOp);
//进行运算
double compute(double opnd1, double opnd2, char oper);
//括号匹配测试函数
bool matchBracket(MyList<char>& op);
void main()
{
MyList<char> stack_oper; //操作符栈
MyList<double> stack_opnd; //操作数栈
stack_oper.push('#');
string express; //表达式
getline(cin,express);
express+='#';
stringstream sIn(express); //输入流
char checkType; //用于测试输入流中的字符
double opNum;
MyList<char> tp;
for(;sIn>>checkType;)
if( isOperator(checkType) )//这段代码用来检测所输入的表达式是否合法特别是括号是否匹配
tp.push(checkType);
if(!matchBracket(tp))
{
cerr<<"Expression error!.";
exit(1);
}
sIn.clear();
sIn.seekg(ios::beg);
for(;sIn>>checkType;)
{
if( isOperator(checkType) )//操作符入栈并判断优先级进行计算
{
switch( compareOper( checkType, stack_oper.getTop() ) )
{
case 1:
if(checkType=='(')
stack_oper.push(')');
else
stack_oper.push(checkType);
break;
case 0:
stack_oper.pop();
break;
case -1:
{
double a=compute(stack_opnd.pop(),stack_opnd.pop(),stack_oper.pop());
stack_opnd.push(a);
sIn.seekg((int)sIn.tellg()-1);
break;
}
}
}
else
{
if( checkType>='0' && checkType<='9' )//操作数入栈
{
sIn.seekg( (int)sIn.tellg()-1);
sIn>>opNum;
stack_opnd.push(opNum);
}
else
{
cerr<<"Expression error! ";
exit(1);
}//if
}//if
}//for
if(!stack_oper.isEmpty())//表达式是否合法
{
cerr<<"Expression error!.";
exit(1);
}
else
cout<<"The result is "<<stack_opnd.getTop();
}//main
int compareOper(char cOpBack, char cOpFront)
{
if( cOpFront==')' && cOpBack == ')')
return 0;
if( cOpFront=='#' && cOpBack == '#')
return 0;
if( (isOperator(cOpFront)*10+1)-(isOperator(cOpBack)*10) > 0)
return -1;
if( (isOperator(cOpFront)*10+1)-(isOperator(cOpBack)*10) < 0)
return 1;
}//compareOper()
int isOperator(char cOp)
{
int PRI;
switch(cOp)
{
case '#':
PRI=-1;
break;
case '+':
case '-':
PRI=2;
break;
case '*':
case '/':
PRI=3;
break;
case '(':
PRI=4;
break;
case ')':
PRI=1;
break;
default:
PRI=0;
break;
}//switch
return PRI;
}//isOperator()
double compute(double opnd1, double opnd2, char oper)
{
switch(oper)
{
case '+':
return opnd1+opnd2;
case '-':
return opnd1-opnd2;
case '*':
return opnd1*opnd2;
case '/':
return opnd1/opnd2;
}//switch
}//compute()
bool matchBracket(MyList<char>& op)
{
MyList<char> temp;
for(int i=1; i<=op.itsLenth();i++)
{
char bracket=op[i];
if(bracket=='(')
temp.push(bracket);
if( bracket==')')
{
if(temp.isEmpty())
return 0;
else
temp.pop();
}
}
return temp.isEmpty();
}//matchBracket()
[此贴子已经被作者于2006-7-26 21:08:31编辑过]