码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-08-10 13:39:29      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:   前缀表达式   后缀表达式   中缀表达式   代码   

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;
}



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

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

标签:   前缀表达式   后缀表达式   中缀表达式   代码   

原文地址:http://blog.csdn.net/q547550831/article/details/47396893

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!