//while (从exp读取字符ch,ch!='\0') //{ 若ch为数字,将后续的所有数字均依次存放到postexp中,并以字符“#”标志数值串结束。 //若ch为左括号“(”,则将此括号进栈到运算符栈op中。 // 若ch为右括号“)”,则将运算符栈op中左括号“(”以前的运算符依次出栈并存放到postexp中,然后将左括号“(”删除。 // 若ch运算符优先级小于或等于op栈顶运算符的优先级 (除栈顶运算符为“(”外)的优先级,则依次出栈并存入到postexp中,然后将ch进栈。 //} //若字符串exp扫描完毕,则将运算栈op中的所有运算符依次出栈并存放到postexp中。最后得到后缀表达式postexp。
#include <stdlib.h> float ComputeValue(const char postExp[]) { struct { double data[20]; int top; } St; St.top = -1; int index = 0; char ch = postExp[index]; while (ch != '\0') { double tmp = 0.0; switch (ch) { case '+': St.data[St.top - 1] = St.data[St.top - 1] + St.data[St.top]; --St.top; break; case '-': St.data[St.top - 1] = St.data[St.top - 1] - St.data[St.top]; --St.top; break; case '/': if (St.data[St.top] != 0) { St.data[St.top - 1] = St.data[St.top - 1] / St.data[St.top]; --St.top; } else { exit(0); } break; default: double d = 0.0; while (ch <= '9' && ch >= '0') { d = 10 * d + ch - '0'; ++index; ch = postExp[index]; } ++St.top; St.data[St.top] = d; break; } ++index; ch = postExp[index]; } return St.data[St.top]; } void Trans(const char exp[], char postExp[]) { struct { char data[50]; int top; } Op; Op.top = -1; int expIndex = 0, index = 0; char ch = exp[expIndex]; while (ch != '\0') { switch (ch) { case '(': ++Op.top; Op.data[Op.top] = ch; break; case ')': while(Op.data[Op.top] != '(') { postExp[index] = Op.data[Op.top]; ++index; --Op.top; } --Op.top; break; case '+': case '-': while(Op.top != -1 && Op.data[Op.top] != '(') // zui di you xian ji { postExp[index] = Op.data[Op.top]; ++index; --Op.top; } ++Op.top; Op.data[Op.top] = ch; break; case '*': case '/': while (Op.data[Op.top] == '*' || Op.data[Op.top] == '/') // 最高优先级 { postExp[index] = Op.data[Op.top]; ++index; --Op.top; } ++Op.top; Op.data[Op.top] = ch; break; case ' ': break; default: while (ch <= '9' && ch >= '0') { postExp[index] = ch; ++index; ++expIndex; ch = exp[expIndex]; } --expIndex; postExp[index] = '#'; ++index; break; } ++expIndex; ch = exp[expIndex]; } while (Op.top != -1) { postExp[index] = Op.data[Op.top]; ++index; --Op.top; } } int main() { char exp[50] = "(56-20)/(4+2)"; char postExp[50] = ""; Trans(exp, postExp); char test[50] = "56#20#-4#2#+/"; ComputeValue(test); return 0; }
Expression
最新推荐文章于 2023-12-20 12:33:02 发布