用优先函数实现对表达式运算

mengying0628 2004-11-25 12:29:07
大致思路:从键盘读入一个表达式,ch是否为字符,是的, 拼数 ;不是,比较栈内算符与栈外算符的优先级 : 是“<”继续读 ;是“=”继续读 ;是“>”继 直至算符栈未空,语句结束。(首先要设置+,-,*,/,(,),#的优先级)


明天要教,高手辛苦一下了拉
...全文
105 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Michael_555 2004-11-25
  • 打赏
  • 举报
回复
自己先做
aheadyes 2004-11-25
  • 打赏
  • 举报
回复
//下面这个是在算法版搜的
//使用运算符栈s和操作数栈sn

{算法基本思想是逐字符从左到右顺序读入表达式。若读入的字符w是数,则直接压入栈 sn中;若w是运算符,则与栈顶运算符比较,若级别高,则进栈;否则,从运算数栈弹出两个操作数,和从运算符栈弹出的一个运算符进行相应运算,结果存入操作数栈中。w运算符再与栈顶运算符比较优先级。直至后缀表达式处理完毕。这时sn栈中只剩一个数,即表达式结果。}


#include <iostream>
#include <string>
#include <stack>
using namespace std;

const char COMPARE[8][8] = {
{ '>', '>', '<', '<', '<', '>', '>', 'E' },// '+'
{ '>', '>', '<', '<', '<', '>', '>', 'E' },// '-'
{ '>', '>', '>', '>', '<', '>', '>', 'E' },// '*'
{ '>', '>', '>', '>', '<', '>', '>', 'E' },// '/'
{ '<', '<', '<', '<', '<', '=', 'E', 'E' },
{ '>', '>', '>', '>', 'E', '>', '>', 'E' },
{ '<', '<', '<', '<', '<', 'E', 'R', 'E' },
{ 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E' }
};

int index(char opr)
{
switch (opr) {
case '+': return 0;
case '-': return 1;
case '*': return 2;
case '/': return 3;
case '(': return 4;
case ')': return 5;
case '#': return 6;
default : return 7;
}
}

char Compare(char x, char y) {
return COMPARE[index(x)][index(y)];
}

struct Token {
int num;
char opr;
bool isNum;
};

void error(string msg) {
cout << msg << endl;
exit(0);
}

bool isOperator(char ch) {
return ( (ch == '+')
|| (ch == '-')
|| (ch == '*')
|| (ch == '/')
|| (ch == '(')
|| (ch == ')')
|| (ch == '#') );

}

bool getToken(string& exp, Token& tok) {
if (exp.length() == 0) return false;
if ( isOperator(exp[0]) ) {
tok.opr = exp[0];
tok.isNum = false;
exp = exp.substr(1);
} else {
int i;
for (i = 1; i < exp.length(); i++) {
if (isOperator(exp[i])) break;
}
tok.isNum = true;
tok.num = atoi(exp.substr(0, i).c_str());
exp = exp.substr(i);
}
return true;
}

double Calculate(double x, double y, char opr)
{
switch (opr) {
case '+': return x + y;
case '-': return x - y;
case '*': return x * y;
case '/': if (y == 0) {
error("Divided by zero!");
return 0;
} else {
return x / y;
}
default: error("Bad Input."); return 0;
}
}


double Evaluate(string exp)
{
stack<char> oprStack;
stack<double> numStack;
Token tok;

exp += '#';
oprStack.push('#');
while ( getToken(exp, tok) ) {
if (tok.isNum) { // the token is a number
numStack.push(tok.num);
} else { // the token is a operator
char res;
double x, y, z;
do {
res = Compare(oprStack.top(), tok.opr);
switch (res) {
case '>': x = numStack.top();
numStack.pop();
y = numStack.top();
numStack.pop();
z = Calculate(y, x, oprStack.top());
numStack.push(z);
oprStack.pop();
break;
case '<': oprStack.push(tok.opr);
break;
case '=': oprStack.pop();
break;
case 'R': return numStack.top();
case 'E': error("Bad Input.");
}
} while (res == '>');
}
}
return numStack.top();
}

void main()
{
string exp;
cin >> exp;
cout << Evaluate(exp) << endl;
system("pause");
}

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧