【编译原理】C++实现“逆波兰式的产生及计算“(超级详细系列、有源码+注解)

您所在的位置:网站首页 逆波兰表达式在线 【编译原理】C++实现“逆波兰式的产生及计算“(超级详细系列、有源码+注解)

【编译原理】C++实现“逆波兰式的产生及计算“(超级详细系列、有源码+注解)

2024-06-22 09:22| 来源: 网络整理| 查看: 265

目录

逆波兰式的产生及计算

1.实验目的

2.实验步骤

2.1由上图可知需要对运算符的优先级进行判断,构造一个优先级类如下:

2.2根据上图算法构造Polish类对逆波兰表达式的生成过程进行编写(我采用了两个栈来分别存储运行数和运算符,优先级的比较在运算符栈进行),然后通过一个打印类将逆波兰表达式结果显示出来:

2.3构造一个cal类用来计算逆波兰表达式的值,这里采用一个栈来进行运算:

3.实验结果

4.实验源码+注释

逆波兰式的产生及计算 1.实验目的

将用中缀式表示的算术表达式转换为用逆波兰式表示的算术表达式,并计算用逆波兰式来表示的算术表达式的值。

2.实验步骤

逆波兰式生成的实验设计思想及算法如下图:

2.1由上图可知需要对运算符的优先级进行判断,构造一个优先级类如下:

2.2根据上图算法构造Polish类对逆波兰表达式的生成过程进行编写(我采用了两个栈来分别存储运行数和运算符,优先级的比较在运算符栈进行),然后通过一个打印类将逆波兰表达式结果显示出来:

2.3构造一个cal类用来计算逆波兰表达式的值,这里采用一个栈来进行运算:

3.实验结果

4.实验源码+注释 #include #include #include #include using namespace std; //using std::string; int priority(char c) //优先级 { switch (c) { case '+': return 1; break; case '-': return 1; break; case '*': return 2; break; case '/': return 2; break; default: return 0; } } string printStack(stack str) { string result; while (!str.empty()) { result = str.top() + result; str.pop(); result + "&"; } return result; } string Polish(string str) //逆波兰表达式 { stackS1; stackS2; for (int i = 0; i < str.length(); i++) { char curChar = str[i]; if ((curChar >= '0') && (curChar = priority(S2.top()))) //当前遍历到的运算符优先级不小于S2栈顶运算符 S2.push(curChar); //将当前遍历到的运算符压入S2 else //如果S2不为空,当前遍历到的运算符优先级小于S2栈顶运算符,将栈顶运算符一直出栈压入S1中, { // //直到栈为空或遇到一个运算符优先级小于当前遍历到的运算符,此时将当前遍历到的运算符压入S2; while (!S2.empty()) { if ((priority(curChar) < priority(S2.top()))) { S1.push(S2.top()); S2.pop(); } else break; } S2.push(curChar); } } else { S2.push(curChar); //如果S2为空,将运算符压入S2中 } } } while (!S2.empty()) //直到遍历完整个中序表达式后,若S2中仍然存在运算符,将这些运算符依次出栈压入S1,直到S2为空; { S1.push(S2.top()); S2.pop(); } return printStack(S1); } int cal(string S1) //计算值 { stackS3; for (int i = 0; i < S1.length(); i++) { char curChar = S1[i]; int a, b, res; if (curChar == '+' || curChar == '-' || curChar == '*' || curChar == '/') { b = S3.top(); S3.pop(); a = S3.top(); S3.pop(); if (curChar == '+') res = a + b; else if (curChar == '-') res = a - b; else if (curChar == '*') res = a * b; else res = a / b; S3.push(res); } else { S3.push(curChar - '0'); } } return S3.top(); } int main() { // cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3