算法 | 中缀表达式转后缀表达式并计算结果(利用栈)

1.手动实现中缀转后缀

算法 | 中缀表达式转后缀表达式并计算结果(利用栈)插图

2.代码实现中缀转后缀并计算表达式结果

为了简化问题,假设算术运算符仅由加、减、乘、除4种运算符和左、右括号组成。

step1: 声明栈结构

#include 
#include 
using namespace std;

#define MaxSize 100
template 
struct SeqStack
{
    DataType data[MaxSize];
    DataType *top;
};

step2: 定义函数TranslateInfixExp实现中缀表达式转后缀表达式

/* 中缀表达式转后缀表达式 */
void TranslateInfixExp(string exp, string &result)
{
    if (exp.empty())
        return;
    // step1: 定义操作符栈并初始化栈
    struct SeqStack opStack;
    opStack.top = opStack.data;

    // step2: 遍历中缀表达式
    char cur;
    for (int i = 0; i = '0' && cur 

注意:

  1. 在将中缀表达式转后缀表达式过程中,每输出一个数字字符,需要在其后补一个空格(与其他相邻数字字符隔开),否则一连串数字字符放在一起无法区分是一个数字还是两个数字。
  2. 遇到数字字符入栈时,若当前运算项位数>1时,需要在当前数字字符入栈后后移一位并重复入栈(代码中switch的default段代码),并在运算项入栈完毕之后需要将索引i回退至后续首个尚未进行优先级判断的运算符上(即非数字字符)。

step3: 定义函数CaculatePostFixExp实现后缀表达式结果计算

/* 计算后缀表达式结果 */
float CaculatePostFixExp(string exp)
{
    float result = 0;
    if (exp.empty())
    {
        cout  numStack;
    numStack.top = numStack.data;

    // step2 : 遍历后缀表达式
    char cur;
    for(int i=0; i= '0' && cur 

注意:

若当前字符为运算符且为减号'-'时,先出栈的为减数,后出栈的为被减数;对于除法'/'也一样。

step4: main函数调用

int main()
{
    string infixExp;   // 存储用户输入的中缀表达式
    string postfixExp; // 存储转换后的后缀表达式
    double result;     // 存储后缀表达式计算机结果
    cout > infixExp; // 6+(7-1)*3+10/2
    cout 

输出:

Please enter an infix expression:
6+(7-1)*3+10/2
The infix expression is:  6+(7-1)*3+10/2
The postfix expression is:  6 7 1 - 3 * + 10 2 / +
The postfix expression calculation result is:  29

文章来源于互联网:算法 | 中缀表达式转后缀表达式并计算结果(利用栈)

THE END
分享
二维码