中缀表达式转后缀表达式

来源:互联网 发布:unctad统计数据库 编辑:程序博客网 时间:2024/05/16 02:02

template <class T>
class stack
{
public:
    stack(int len = 50)
    {
        elem = new T[len];
        m_top = -1;
    }
    void Push(const T &val)
    {
        elem[++m_top] = val;
    }
    bool isEmpty()
    {
        return m_top == -1;
    }
    T& Pop()
    {
        return elem[m_top--];
    }
    T& getTop()
    {
        return elem[m_top];
    }
private:
    T *elem;
    int m_top;
};

int getPriority(char ch)
{
    if(ch == '+' || ch == '-')
        return 1;
    if(ch == '*' || ch == '/')
        return 2;
    return 0;
}

char* InfixtoSuffixS(char* exp,int len)      //中缀转后缀

{
    int x = 0;
    char *tmpExp = new char[len];
    memset(tmpExp,'\0',len);
    stack<char> opStack(len);
    for(int i = 0;i<len;i++)
    {
        switch(exp[i])
        {
        case'(':
            opStack.Push(exp[i]);
            break;
        case ')':
            while(opStack.getTop() != '(')
                tmpExp[x++] = opStack.Pop();
            opStack.Pop();
            break;
        case '+':case '-':    case '*':case '/':
            while(!opStack.isEmpty() && opStack.getTop() !='(' &&
                    getPriority(opStack.getTop()) <= getPriority(exp[i]))
                tmpExp[x++] = opStack.Pop();
            opStack.Push(exp[i]);
            break;
        default:
            tmpExp[x++] = exp[i];
            break;
        }
    }
    while(!opStack.isEmpty())
    {
        char tmp = opStack.Pop();
        if(tmp != '(')
            tmpExp[x++] = tmp;
    }
    return tmpExp;
}
0 0
原创粉丝点击