表达式求值
一、需求分析
以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。利用教科书表3.1给出的算符优先关系,实现对算术四则混合运算表达式的求值,并仿照教科书的例3-1演示在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。
二、部分代码
1.定义优先级
char Precede(char t1, char t2)
{
char opt[8][8]={ ">><<<>>",//53页表3.1优先级
">><<<>>",
">>>><>>",
">>>><>>",
"<<<<<=@",
">>>>@>>",
"<<<<<@="};
int i, j ;
switch(t1)
{
case '+': i=0; break;
case '-': i=1; break;
case '*': i=2; break;
case '/': i=3; break;
case '(': i=4; break;
case ')': i=5; break;
case '#': i=6; break;
}
switch(t2) {
case '+': j=0; break;
case '-': j=1; break;
case '*': j=2; break;
case '/': j=3; break;
case '(': j=4; break;
case ')': j=5; break;
case '#': j=6; break;
}
return opt[i][j];
}
2.返回操作数a和b在二元运算符op下的运算结果
int Operate( int a, char op, int b)
{
int result;
switch(op)
{
case '+': result = a+b; break;
case '-': result = a-b; break;
case '*': result = a*b; break;
case '/': result = a/b; break;
}
return result;
}
3.主函数
int main()
{
int change, temp, k;
stack<int>OPTR;
stack<char>OPND;
OPND.push('#');
string str;
cout <<"请输入表达式:" << endl;
getline(cin,str);
str[str.size()]='#';
int i= 0;
while (i<=str.size())
{
if(str[i]>='0'&&str[i]<='9')
{
int j=1;//记录共有几个数字
int iTemp=i;//记录此时i的值
while(str[i+1]>='0'&&str[i+1]<='9')
{
j++;
i++;
}
temp =0;
change =0;
int jTemp = j-1;
for( k=0; k<j; k++)
{
change=str[iTemp+k]-'0';
temp+=change*pow(10,jTemp--);//将字符串转化为数字
}
OPTR.push(temp);
i++;
}
else{
switch (Precede(OPND.top(),str[i]))
{
case '<':OPND.push(str[i]);i++;break;
case '>':
{
int right = OPTR.top();OPTR.pop();
int left = OPTR.top();OPTR.pop();
if(right==0&&OPND.top()=='/')
{
cout << "error(分母不能为0)";
return 0;
}
else
{
OPTR.push(Operate(left,OPND.top(),right));
OPND.pop();
}
break;
}
case '=':OPND.pop();i++;break; //脱括号
case '@':cout<< "error"; return 0;
}
}
}
cout << "表达式的值=";
cout <<OPTR.top()<< endl;
return 0;
}
本程序借鉴资料与相关代码,不住之处希望指出。
本文介绍了一种基于算符优先关系的算术表达式求值算法,通过使用运算符栈和运算数栈,实现了从终端输入的整数表达式的求值。详细展示了算法流程,包括优先级定义、运算执行及主函数处理。
3934

被折叠的 条评论
为什么被折叠?



