利用栈将中缀表达式转为后缀表达式

Posted pesuedream

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用栈将中缀表达式转为后缀表达式相关的知识,希望对你有一定的参考价值。

#include<iostream>
#include<stdio.h>
using namespace std;
#include<stack>
const int SM = 40;
int Precedence(char op){
    //返回运算符op所对应的优先级数值
    switch (op){
    case ‘+‘:
    case ‘-‘:return 1;//定义加减运算的优先级为1
    case ‘*‘:
    case ‘/‘:return 2;//定义乘除运算的优先级为2
    default:return 0;
    }
}
//将字符串s1中的中缀表达式转换为字符串s2中的后缀表达式
void Transfer(char s1[SM],char s2[SM]){
    stack<char> R;//定义运用暂存运算符的栈
    R.push(‘@‘);//栈底放入"@"字符,它具有最低优先级0
    int i, j;//用于指示扫描s1和s2中的字符串的位置
    i = 0;
    j = 0;
    char ch = s1[i];
    while (ch != ‘@‘){
        //顺序处理中缀表达式中的每个字符
        if (ch == ‘ ‘){
            ch = s1[++i];
        }//对于空格字符不做任何处理
        else if (ch == ‘(‘){
            R.push(ch);
            ch = s1[++i];
        }//当字符为左括号,直接进栈
        else if (ch == ‘)‘){
            while (R.top() != ‘(‘){
                s2[j++] = R.top();
                R.pop();
            }
            R.pop();//跳出while循环后,说明此时ch为左括号,继续左括号出栈,删除栈顶的左括号
            ch = s1[++i];
        }//当字符为右括号,使括号内的仍停留在栈中的运算符依次出栈并写入到s2中
        else if (ch == ‘+‘ || ch == ‘-‘ || ch == ‘*‘ || ch == ‘/‘){
            //对于四则运算符,使暂存在栈中的不低于ch优先级的运算符依次出栈并写入到s2中
            char w = R.top();
            while (Precedence(w) >= Precedence(ch)){
                //Precedence()函数返回运算符形参的优先级
                s2[j++] = w;
                R.pop();
                w = R.top();
            }
            R.push(ch);
            ch = s1[++i];
        }
        else{//此处必为数字或小数点符号
            while (isdigit(ch) || ch == ‘.‘){
                //把一个数值中的每一位依次写入到s2串中
                s2[j++] = ch;
                ch = s1[++i];
            }
            //被转换后的每个数值后放入一个空格
            s2[j++] = ‘ ‘;

        }
    }
        //把暂存在栈中的运算符依次出栈并写入到s2串中
        ch = R.top();
        R.pop();
        while (ch != ‘@‘){
            if (ch == ‘(‘){
                cerr << "expression error!" << endl;
                exit(1);
            }
            else(s2[j++] = ch);
            ch = R.top();
            R.pop();
        }
        s2[j++] = ‘@‘;
        s2[j++] = ‘‘;



}
void main(){
    char p1[40];
    char p2[40];
    cout << "输入中缀表达式:";
    cin >> p1;
    Transfer(p1, p2);
    cout << "输出后缀表达式为:" << p2 << endl;
    getchar();
}

技术图片

 

以上是关于利用栈将中缀表达式转为后缀表达式的主要内容,如果未能解决你的问题,请参考以下文章

中缀表达式转为后缀表达式(逆波兰式)求值

java简易计算机(用栈实现中缀转后缀,计算后缀表达式)

表达式的计算(中缀表达式转为后缀表达式或逐步计算)

后缀表达式转为中缀表达式

数据结构中缀表达式转后缀表达式以及后缀转中缀表达式

计算器核心算法——中缀表达式转为后缀表达式