【求助】:请看看这个程序错在哪儿
这是一个小计算器
程序代码:#include<iostream>
using std::cout;
const int MAXSIZE=20;
template<typename type>
class STACK
{
private:
type data[MAXSIZE];
int index;
public:
STACK(){index=0;}
type pop(){--index;return data[index];}
void push(type t){data[index]=t;++index;}
bool empty(){return index==0;}
};
class calc
{
private:
char* expression;//指向要求解的中缀表达式
enum token{OPAREN,ADD,SUB,MULTI,DIV,CPAREN,VALUE,EOL};
void BinaryOp(token op,STACK<double>& dataStack);
token getOp(double& value);
public:
calc(char* e){expression=e;}
double result();
};
void calc::BinaryOp(calc::token op, STACK<double> &dataStack)
{
double num1,num2,result;
num2=dataStack.pop();
num1=dataStack.pop();
switch(op)
{
case ADD:result=num1+num2;break;
case SUB:result=num1-num2;break;
case MULTI:result=num1*num2;break;
case DIV:result=num1/num2;break;//忽略除数为0的情况
}
dataStack.push(result);
}
calc::token calc::getOp(double &value)
{
while(*expression)
{
if(*expression<='9'&&*expression>='0')
{
value=0;
while(*expression<='9'&&*expression>='0')
{
value=value*10+*expression-'0';
++expression;
}
return VALUE;
}
switch(*expression)
{
case '(':++expression;return OPAREN;
case ')':++expression;return CPAREN;
case '+':++expression;return ADD;
case '-':++expression;return SUB;
case '*':++expression;return MULTI;
case '/':++expression;return DIV;
}
}
return EOL;
}
double calc::result()
{
STACK<token> opStack;
STACK<double> dataStack;
double value;
token TOKEN,topOp;
while(true)
{
TOKEN=getOp(value);
if(TOKEN==EOL)
break;
switch(TOKEN)
{
case VALUE:dataStack.push(value);break;
case OPAREN:opStack.push(OPAREN);break;
case CPAREN:while((topOp=opStack.pop())!=OPAREN)
BinaryOp(topOp,dataStack);
break;
case MULTI:case DIV:while((topOp=opStack.pop())==MULTI||topOp==DIV)
BinaryOp(topOp,dataStack);
opStack.push(topOp);
opStack.push(TOKEN);
break;
case ADD:case SUB:while(!opStack.empty()&&(topOp=opStack.pop())!=OPAREN)
BinaryOp(topOp,dataStack);
opStack.push(topOp);//为何运行时此处会发生内存冲突? .........................................................
opStack.push(TOKEN);
}
}
while(!opStack.empty())
BinaryOp(topOp,dataStack);
return dataStack.pop();
}
int main()
{
calc e("3+4*(5-3)");
cout<<e.result()<<'\n';
return 0;
}
[ 本帖最后由 紫凤双飞 于 2011-8-22 14:57 编辑 ]





牛B