表达式求值及转换算法
2015-09-16 00:10
302 查看
后缀表达式求值算法
前缀表达式求值算法
算法一:从表达式尾部开始处理(从右至左)
伪代码描述:
算法二:从表达式首部开始处理(从左至右)
中缀表达式转换为后缀表达式算法
中缀表达式转换为前缀表达式算法
从表达式尾部开始处理
stack operands; //运算数栈 while(没到表达式尾) { scanf("一个运算对象op"); if(op is 运算数) operands.push(op); else if(op is 运算符) { operand_right = operands.pop(); operand_left = operands.pop(); result = operand_left op operand_right; operands.push(result); } else { printf("Suffix expression is invalid !"); } } if(operands.size() == 1) return operands.top(); else printf("Suffix expression is invalid!");
前缀表达式求值算法
算法一:从表达式尾部开始处理(从右至左)
伪代码描述:
stack operands; //运算数栈 while(没到达表达式首) { scanf("一个运算对象op"); if(op is Operand) operands.push(op); else if(op is Operator) { operand_left = operands.pop(); operand_right = operands.pop(); result = operand_left op operand_right; operands.push(result); } else { printf("Prefix expression is invalid!"); } } if(operands.size() == 1) { return operands.top(); } else printf("Prefix expression is invalid!");
算法二:从表达式首部开始处理(从左至右)
stack operations; //运算对象栈,元素既可以是云算法,也可以是运算数 while(没到表达式尾) { scanf("一个运算对象op"); if(op is Operator) { operations.push(op); } else if(op is Operand) { if(operations.top() is Operator) { operations.push(op); } else { while(operations.top() is Operand) { operand_right = op; operand_left = operations.pop(); operator = operations.pop(); op = operand_left operator operand_right; } operations.push(op); } } else { printf("Prefix expression is invalid!"); } } if(operations.size() == 1) return operations.top(); else printf("Prefix expression is invalid!");
中缀表达式转换为后缀表达式算法
stack operators; //运算符栈 while(没到表达式尾) { scanf("一个运算对象op"); if(op is Operand) { printf(op); } else if(op is Operator) { if(op 优先级大于 operator.top() && op is not 右括号) operator.push(op); else if(op is 右括号) { do { tmp = operators.pop(); if(tmp is not 对应左括号) { printf(tmp); } else { break; } if(operators.empty()) { printf("Infix expression is invalid!"); } }while(1); } else { do { tmp = operators.pop(); printf(tmp); }while(op 优先级小于 operators.top()); operators.push(op); } } else { printf("Infix expression is invalid!"); } } while(!operators.empty()) { tmp = operators.pop(); printf(tmp); }
中缀表达式转换为前缀表达式算法
从表达式尾部开始处理
stack operators; //运算符栈stack operations; //运算对象栈,元素既可以是运算符,也可以是运算数while (没到表达式首){ scanf("一个运算对象op"); if (op is Operand) { operations.push(op); } else if (op is Operator) { if (op 优先级大于 operators.top() && op is not 左括号) operators.push(op); else if (op is 左括号) { do { tmp = operators.pop(); if (tmp is not 对应右括号) { operations.push(tmp); } else { break; } if (operators.empty()) { printf("Infix expression is invalid!"); } }while(1); } else { do { tmp = operators.pop(); operations.push(tmp); }while(op 优先级小于 operators.top()); operators.push(op); } } else { printf("Infix expression is invalid!"); }}while(!operators.empty()){ tmp = operators.pop(); operations.push(tmp);}while(!operations.empty()){ tmp = operations.pop(); printf(tmp);}
相关文章推荐
- POJ水题集2
- 搭建xmpp环境的一些知识点和链接
- POJ - 2524 Ubiquitous Religions(并查集)
- Webfrom学习随笔
- 【图论】DAG上的相关问题
- HTML5部分新增标签
- 面试——计算机网络专项练习题(一)
- mysql忘记root密码
- POJ - 2236 Wireless Network(并查集)
- POJ水题集1
- BOSH、长连接和短连接、http的理解
- 2015年9月13日-9月15日课程作业(shell)基础知识
- HDOJ 题目4489 The King’s Ups and Downs(组合DP打表)
- 配置vim编写C/C++程序时自动缩进
- java导出cvs文件
- 自定义view文字垂直居中
- viewPager中加入导航点
- 浅谈Java的==、equals()、hashcode()
- Jquery简单实现前端搜索功能
- 整点文艺的