表达式求值是程序设计语言编译中的一个基本问题,它的实现就是对“栈”的典型应用。本文针对表达式求值使用的是最简单直观的算法“算符优先法”。
本文给出两种方式来实现表达式求值,方式一直接利用中缀表达式求值,需要用到两个栈,操作数栈和操作符栈。首先置操作数栈为空栈, 操作符栈仅有“#”一个元素。依次读入表达式中的每个字符,若是操作数则进操作数栈,若是操作符则和操作符栈的栈顶运算符比较优先权作相应操作,直至整个表达式求值完毕。方式二首先把中缀表达式转换为后缀表达式并存储起来,然后利用读出的后缀表达式完成求值,其本质上是方式一的分解过程。
表达式求值的代码如下:
#include <iostream> #include "stack" #include "map" using namespace std; /* 只能求一位整数的加减乘除混合运算 */ map<char, pair<int, int>> priority; // 存放各个操作符的栈内栈外优先级,first是栈内,second是栈外 char infix[50]; // 存放初始的中缀表达式 char postfix[50]; // 存放转化的后缀表达式 int result; void MakePriority() // 构造运算符优先级表 { priority.insert(make_pair('#', make_pair(0, 0))); // isp(#)=0, icp(#)=0 priority.insert(make_pair(' ', make_pair(0, 0))); // isp( )=0, icp( )=0 表达式结尾的'#'用' '代替,这样可以省略表达式末尾的结束符'#' priority.insert(make_pair('(', make_pair(1, 6))); // isp(()=1, icp(()=6 priority.insert(make_pair('*', make_pair(5, 4))); // isp(*)=5, icp(*)=4 priority.insert(make_pair('/', make_pair(5, 4))); // isp(/)=5, icp(/)=4 priority.insert(make_pair('%', make_pair(5, 4))); // isp(%)=5, icp(%)=4 priority.insert(make_pair('+', make_pair(3, 2))); // isp(+)=3, icp(+)=2 priority.insert(make_pair('-', make_pair(3, 2))); // isp(-)=3, icp(-)=2 priority.insert(make_pair(')', make_pair(6, 1))); // isp())=6, icp())=1 } void InfixToPostfix() // 把中缀表达式转换为后缀表达式 { int i = 0; stack<char> optrStack; // 操作符栈 char optr; // optr为栈顶的操作符 optrStack.push('#'); while (!optrStack.empty()) { if (isdigit(infix[i])) // 是操作数则直接输出(追加到postfix结尾) { postfix[strlen(postfix)] = infix[i]; postfix[strlen(postfix) + 1] = '