回 帖 发 新 帖 刷新版面

主题:运算表达式改为它对应的后缀表达式

谁有 算法
把运算表达式 改为他对应的 后缀表达式
如:3/5+6  后缀表达式为:3 5 / 6 +
2*(8+9)/(1-5) 后缀表达式 为:2 8 9 + * 1 5 - /
把它放到字符数组里

回复列表 (共4个回复)

沙发

[code=c]
#include <iostream>
#include <string>
#include <stack>
#include <cstring>
#include <cctype>
using namespace std;

int c2v(char c)
{
    switch (c) {
        case '/': case '*': return 1;
        case '+': case '-': return 0;
    }
    return -1;
}
int comp_oper(char c1, char c2)
{
    return c2v(c1) - c2v(c2);
}

void expr2suffix(const char* expr, char* suffix)
{
    stack<char> oper_stack;
    string sfx;
    for (int i = 0; i < strlen(expr); ++i) {
        if (isdigit(expr[i]))
            sfx += expr[i];
        else if (expr[i] == '(')
            oper_stack.push(expr[i]);
        else if (expr[i] == ')') {
            while (oper_stack.top() != '(') {
                sfx += oper_stack.top();
                oper_stack.pop();
            }
            oper_stack.pop();
        } else if (expr[i] == '+' || expr[i] == '-' ||
                expr[i] == '*' || expr[i] == '/') {
            while (!oper_stack.empty()
                    && comp_oper(expr[i], oper_stack.top()) <= 0) {
                sfx += oper_stack.top();
                oper_stack.pop();
            }
            oper_stack.push(expr[i]);
        }
    }
    while (!oper_stack.empty()) {
        sfx += oper_stack.top();
        oper_stack.pop();
    }
    strcpy(suffix, sfx.c_str());
}

int main()
{
    char s1[] = "3/5+6";
    char s2[] = "2*(8+9)/(1-5)";
    char* ss1 = new char[strlen(s1) + 1];
    char* ss2 = new char[strlen(s2) + 1];
    expr2suffix(s1, ss1);
    expr2suffix(s2, ss2);
    for (int i = 0; i < strlen(ss1); ++i)
        cout << ss1[i] << ' ';
    cout << endl;
    for (int i = 0; i < strlen(ss2); ++i)
        cout << ss2[i] << ' ';
    cout << endl;

    return 0;
}
[/code]

板凳

int    d[7][7]={2,2,1,1,1,2,2,
        2,2,1,1,1,2,2,
        2,2,2,2,1,2,2,
        2,2,2,2,1,2,2,
        1,1,1,1,1,0,-1,
        2,2,2,2,-1,2,2,
        1,1,1,1,1,-1,0};
    char a[7]={'+','-','*','/','(',')','#'};
    int i=0,j=0;
    while(!(str1==a[i])) i++;
        while(!(str2==a[j])) j++;
        return d[i][j];
}
string Change(string  expstr)
{
    char A;
        expstr+='#';
        SqStack S1,S2;
        InitStack (S1);//放 运算符
        InitStack (S2);//放 后缀式
        Push(S1, '#');
for(int i=0;i<expstr.length();)
            {
                int flag=1;
                if(expstr[i]==' ') {i++;continue;}
                while(expstr[i]>=48&&expstr[i]<=57)
                {
                    Push(S2,expstr[i]);i++;
                }
                Push(S2,' ');
                while(flag)
                {
         switch(Compare(GetTop(S1),expstr[i]))
                {
                case 2: A=Pop(S1);Push(S2,A);break;
                case 1:Push(S1,expstr[i]); flag=0;break;
                case 0: Pop(S1);flag=0;break;
                default: flag=0; cout<<"Expression error!"<<endl;
                    if(EmptyStack(S1)) break;
                }//switch
        Push(S2,' ');
                }//while(flag)
                if(EmptyStack(S1)) break;
                i++;
            }//for
        //expstr.clear();
      SElemType *p=S2.base;
      string str;
        while( p<S2.top)
        {
            str +=*  p;
            p++;
        }
        cout<<str<<endl;
        system ("pause");
        return str;
}//Change

3 楼

你可以参考一下“数据结构的C++伪码实现”, 第154页, 很经典的一本书。

4 楼

谢谢   是英文版吗  我怕我看不懂

我来回复

您尚未登录,请登录后再回复。点此登录或注册