您的位置:首页 > 其它

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

2015-08-10 12:17 381 查看

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: