一、问题描述
方法1:利用栈实现表达式求值。可以用两个栈分别保存运算符和操作数(本文链接)
方法2:也可以借助二叉树,将表达式转换成逆波兰式,用一个栈实现表达式求值(待更)
二、任务要求
根据用户输入的一个表达式,包含”+”、”-”、”X”、”\”、”(”、”)”运算符,能正确输出表达式的值。
三、基本过程
- 在该程序中建有两个栈:
一个用于存储运算符,另一个用于存储操作数或运算结果。 - 基本过程是:
(1) 首先设置操作数栈为空栈,设置运算符栈以‘#’为栈底元素(其优先级最低)。
(2) 通过为栈内栈外运算符设置值而比较其优先级
(3) 依次去找到表达式中的所有运算符和操作数,对于操作数直接入栈,运算符则和运算符栈的栈顶运算进行比较优先级,若栈内优先级大,则进行相应操作并操作数和栈内运算符都出栈,若优先级相等只需栈内运算符出栈继续查找下一个运算符即可,若栈内优先级低则栈外运算符入栈。依次循环知道分析完表达式中的所有运算符和操作数即可。
(4) 最后在操作数栈中将只会剩下唯一的一个元素,而该元素也将就会是所求表达式的值。
四、C++完整代码
#include<iostream>
#include<stack>
//#include<string>
#define MAXSIZE 100
#define SIZE 8
using namespace std;
const char
pre[SIZE][SIZE]={
">><<<>>",
">><<<>>",
">>>><>>", // 0 1 2 3 4 5 6
">>>><>>", // + - * / ( ) #
"<<<<<=0",
">>>>0>>",
"<<<<<0="
};
char Judge( char c1 , char c2 ) //判断字符c1和c2的大小
{
int i , j ;
switch( c1 )
{
case '+':i=0;break;
case