中缀表达式到前缀表达式和后缀表达式

1、算法思路

转化为后缀:从左到右遍历中缀表达式,遇到操作数,输出,遇到操作符,当前操作符的优先级大于栈顶操作符优先级,进栈,否则,弹出栈顶优先级大于等于当前操作符的操作符,当前操作符进栈。

转化为前缀:从右到左遍历中缀表达式,遇到操作数,输出,遇到操作符,当前操作符的优先级大于等于栈顶操作符优先级,进栈,否则,弹出栈顶优先级大于当前操作符的操作符,当前操作符进栈。--参考该网址

以上方法需要先定义操作符优先级,当然,可以定义。但是这样会麻烦许多,那么不如用括号来进行进行限定。这样就不需要写判断优先级函数了。

2、中缀表达式转后缀表达式

‘(‘,‘+‘,‘-‘,‘*‘,‘/‘入栈

‘)‘输出栈中到‘(‘的元素

其他字符直接输出

附代码:

void inTopast(char* str)    //中缀到后缀
{
    int slen = strlen(str); //字符长度
    int top = -1;   //栈顶
    top++;
    for(int i = 0; i < slen; i++)   //正序
    {
        char c = str[i];    //提取一字符
        switch(c)   //比较
        {
            //'(','+','-','*','/'入栈
            //')'输出栈中到'('的元素
            //其他字符直接输出
            case '(' :
                stacks[top++].s = c;
                break;
            case ')' :
                while(stacks[--top].s != '(')
                    cout << stacks[top].s;
                break;
            case '+' :
                stacks[top++].s = c;
                break;
            case '-' :
                stacks[top++].s = c;
                break;
            case '*' :
                stacks[top++].s = c;
                break;
            case '/' :
                stacks[top++].s = c;
                break;
            default :
                cout << c;
        }
    }
    cout << endl;
}

3、中缀表达式转前缀表达式

‘)‘,‘+‘,‘-‘,‘*‘,‘/‘入栈

‘(‘保存栈中到‘)‘的元素

其他字符直接保存

将保存的字符串逆序输出就是前缀表达式

附代码:

void inToprev(char* str)    //中缀到前缀
{
    int slen = strlen(str); //字符长度
    int top = -1;   //栈顶
    top++;
    char res[MAX_LENGTH];
    int num = 0;
    for(int i = slen -1; i >= 0; i--)   //逆序
    {
        char c = str[i];    //提取一字符
        switch(c)   //比较
        {
            //')','+','-','*','/'入栈
            //'('保存栈中到')'的元素
            //其他字符直接保存
            case ')' :
                stacks[top++].s = c;
                break;
            case '(' :
                while(stacks[--top].s != ')')
                    res[num++] = stacks[top].s;
                break;
            case '+' :
                stacks[top++].s = c;
                break;
            case '-' :
                stacks[top++].s = c;
                break;
            case '*' :
                stacks[top++].s = c;
                break;
            case '/' :
                stacks[top++].s = c;
                break;
            default :
                res[num++] = c;
        }
    }
    //将保存的字符串逆序输出就是前缀表达式
    for(int i = num - 1; i >= 0; i--)
        cout << res[i];
    cout << endl;
}

4、源程序

#include <iostream>
#include <cstring>

using namespace std;

int const MAX_LENGTH = 100;
typedef struct
{
    char s;
}Stacks;   //栈结构定义

Stacks stacks[MAX_LENGTH];  //栈

void inTopast(char* str)    //中缀到后缀
{
    int slen = strlen(str); //字符长度
    int top = -1;   //栈顶
    top++;
    for(int i = 0; i < slen; i++)   //正序
    {
        char c = str[i];    //提取一字符
        switch(c)   //比较
        {
            //'(','+','-','*','/'入栈
            //')'输出栈中到'('的元素
            //其他字符直接输出
            case '(' :
                stacks[top++].s = c;
                break;
            case ')' :
                while(stacks[--top].s != '(')
                    cout << stacks[top].s;
                break;
            case '+' :
                stacks[top++].s = c;
                break;
            case '-' :
                stacks[top++].s = c;
                break;
            case '*' :
                stacks[top++].s = c;
                break;
            case '/' :
                stacks[top++].s = c;
                break;
            default :
                cout << c;
        }
    }
    cout << endl;
}

void inToprev(char* str)    //中缀到前缀
{
    int slen = strlen(str); //字符长度
    int top = -1;   //栈顶
    top++;
    char res[MAX_LENGTH];
    int num = 0;
    for(int i = slen -1; i >= 0; i--)   //逆序
    {
        char c = str[i];    //提取一字符
        switch(c)   //比较
        {
            //')','+','-','*','/'入栈
            //'('保存栈中到')'的元素
            //其他字符直接保存
            case ')' :
                stacks[top++].s = c;
                break;
            case '(' :
                while(stacks[--top].s != ')')
                    res[num++] = stacks[top].s;
                break;
            case '+' :
                stacks[top++].s = c;
                break;
            case '-' :
                stacks[top++].s = c;
                break;
            case '*' :
                stacks[top++].s = c;
                break;
            case '/' :
                stacks[top++].s = c;
                break;
            default :
                res[num++] = c;
        }
    }
    //将保存的字符串逆序输出就是前缀表达式
    for(int i = num - 1; i >= 0; i--)
        cout << res[i];
    cout << endl;
}

int main()
{
    //测试数据
    char str1[] = "((a+b)*c)";
    char str2[] = "((a*(b+c))*d)";
    inTopast(str1);
    inTopast(str2);
    inToprev(str1);
    inToprev(str2);
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 18:10:22

中缀表达式到前缀表达式和后缀表达式的相关文章

算术表达式求值系列之后缀表达式转后缀表达式

1 package data.struct.algorithm; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 7 //定义栈,用于存放转换过程中的操作符 8 class StackFix { 9 // 栈的大小 10 private int maxSize; 11 // 数组模拟栈 12 private char stackArr[];

前缀、中缀、后缀表达式

先举例: (3 + 4) × 5 - 6 中缀表达式- × + 3 4 5 6 前缀表达式3 4 + 5 × 6 - 后缀表达式 以前没见过前缀和后缀表达式,感觉一下刷新了知识库!原来在计算机里早已司空见惯了…… 完了,一下暴露非科班出身了……不扯了,下面这篇文章对这三种表达式介绍的很不错,特拿来分享下! 地址:http://blog.csdn.net/antineutrino/article/details/6763722

【转】前缀、中缀、后缀表达式

它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前:中缀和后缀同理. 举例: (3 + 4) × 5 - 6 就是中缀表达式 - × + 3 4 5 6 前缀表达式 3 4 + 5 × 6 - 后缀表达式 中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计

深入理解前缀、中缀、后缀表达式

1.我们首先来看一下,什么是前缀.中缀.后缀表达式: 中缀表达式: 2 - 3 * 4 后缀表达式:2 3 4 * - 前缀表达式:- 2 * 3 4 简单介绍下,前中后的划分依据为两个数字的操作符处于两个数字的前面,中间还是后面,其中中缀表达式为我们日常生活中常见的表达形式. 2.重要操作过程 后缀表达式求值过程: 从左到右扫描后缀表达式:遇到数字就将其压入栈中:遇到操作符,则取出栈顶的两个元素(栈顶元素为a, 另一个为b),并计算b 操作符 a的取值,并将结果重新压入栈中.扫描整个表达式结束

java四则运算----前缀、中缀、后缀表达式

接到一个新需求,需要实现可配置公式,然后按公式实现四则运算. 刚拿到需求,第一反应就是用正则匹配‘(’,‘)’,‘+’,‘-’,‘*’,‘/’,来实现四则运算,感觉不复杂. 然后开始coding.发现有点复杂,然后各种for,感觉非常不爽,于是问网上搜了下,发现一种叫波兰式的计算方法,瞬间茅塞顿开. http://blog.csdn.net/antineutrino/article/details/6763722 以下为原文引用 它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.

表达树—轻松获取前缀、中缀、后缀表达式(二)

一.回顾二叉树的递归遍历 前序遍历:访问根结点-->前序遍历根结点的左子树-->前序遍历根结点的右子树. 中序遍历:中序遍历根结点的左子树-->访问根结点-->中序遍历根结点的右子树. 后序遍历:后序遍历根结点的左子树-->后序遍历根结点的右子树-->访问根结点. 二.二叉树递归遍历获得表达式 假设,已知中缀表达式为:(A+B*C)/D,需要获得前缀表达式,后缀表达式. 总结:表达树的前序遍历为前缀表达式,中序遍历为中缀表达式,后续遍历为后缀表达式. 前缀表达式(前序遍

前缀、中缀、后缀表达式及其求值

它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前:中缀和后缀同理. 比如: (4 + 5) × 6- 7 就是中缀表达式 - × + 4567 前缀表达式 45 + 6×7 - 后缀表达式 中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表

前缀表达式、中缀表达式和后缀表达式

前缀.中缀.后缀表达式 前缀.中缀.后缀表达式是对表达式的不同记法,其区别在于运算符相对于操作数的位置不同,前缀表达式的运算符位于操作数之前,中缀和后缀同理 举例: 中缀表达式:1 + (2 + 3) × 4 - 5 前缀表达式:- + 1 × + 2 3 4 5 后缀表达式:1 2 3 + 4 × + 5 - 中缀表达式 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中

栈的应用之中缀表达式转后缀表达式

1,中缀表达式的定义及为什么要将中缀表达式转换为后缀表达式? 中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值.对计算机来说,计算前缀或后缀表达式的值要比中缀表达式简单. 比如,计算机计算后缀表达式的过程如下----后缀表达式的计算机求值: 从左

关于后缀表达式和中缀表达式的思考

众所周知啦,我们数学里面的公式就是中缀表达式(infix),形如a*(b+c),支持括号用于调整运算的顺序.我们平常用的就是中缀表达式. 那么什么是后缀表达式(postfix)? 后缀表达式(又称为逆波兰reverse polish)就是不需要括号就可以实现调整运算顺序的一种技法. 比如:ab+cde+** 上面就是一个典型的后缀表达式,将它改为中缀表达式其实是(a+b)*((d+e)*c).我们这样将后缀表达式转换成中缀表达式,虽然符合我们的数学计算习惯,但是并不符合计算机运算的方式.我们可以