读书人

后缀转中缀,该如何解决

发布时间: 2012-04-09 13:41:24 作者: rapoo

后缀转中缀
给出由数字和四则运算符组成的后缀表达式,转换为中缀表达式,输出的时候如果有必要加上括号则括号要加上。
我想用栈来实现,但是判断是不是要加括号的时候不知道怎么判断了。
3 2 - 2 5 + * 5 9 - /,比如这个该怎么判断是否加括号,输出为(3-2)*(2+5)/(5-9)

[解决办法]

C/C++ code
string m(string str,char c){        if(str.size() == 1 || (str[str.size()-1] != '+' && str[str.size()-1] != '-' && str[str.size()-1] != '*' && str[str.size()-1] != '/'))        return str;    else if(str.size() == 3)    {        string st(str);        st[0] = str[0];        st[1] = str[2];        st[2] = str[1];        if((c == '*' || c == '/') && (str[str.size()-1] != '*' && str[str.size()-1] != '/'))        {            st = "(" + st + ")";        }        return st;    }    else    {        string s2,s1;        if(str[str.size()-2]-'0' >=0 && str[str.size()-2]-'0' <9)        {            string str2 = str.substr(str.size()-2,1);            string str1 = str.substr(0,str.size()-2);                s2 = m(str2,str[str.size()-1]);            s1 = m(str1,str[str.size()-1]);        }else        {            string str2 = str.substr(str.size()-4,3);            string str1 = str.substr(0,str.size()-4);                s2 = m(str2,str[str.size()-1]);            s1 = m(str1,str[str.size()-1]);        }        string s =  s1 + str[str.size()-1] + s2;        if(c != '#')            return s;        else         if((c == '*' || c == '/') && (str[str.size()-1] != '*' && str[str.size()-1] != '/'))        {            return "(" + s + ")";        }        else            return s;    }}void main(){    string st = "32-25+*59-/";    cout<<m(st,'#')<<endl;        system("pause");}
[解决办法]
C/C++ code
#include <stdio.h>#include <stdlib.h>#include <string.h>#define RETURN  0x0d // \r#define NEWLINE 0x0a // \n#define SPACE   0x20#define TAB     0x09 // \t#define SEPERATOR   0x2c // ,#define ISOPERATOR(c)   \        (('+' == c) || ('-' == c) || ('*' == c) || ('/' == c))#define ISSEPERATOR(c)  \        ((SEPERATOR == c) || (SPACE == c) || (TAB == c))#define PRIORITY(op)    \        ((('*' == op) || ('/' == op)) ? (short)1 : (short)0)typedef struct _ITEM{    char* expr;    short priority;    short merged;    struct _ITEM* next;} TItem, *PTItem;void merge_link(PTItem phdr, char op){    if(! phdr || ! phdr->next) exit(-1);    PTItem pn1 = phdr->next;    PTItem pn2 = pn1->next;    if(! pn2) exit(-1);    pn2->expr = (char*)realloc(pn2->expr, strlen(pn2->expr) + sizeof(char) + strlen(pn1->expr) + 4 + 1);    if(PRIORITY(op) > pn2->priority)    {                        char* p = pn2->expr + strlen(pn2->expr);        *(p + 1) = 0x00;        while(p > pn2->expr)        {            *p = *(p - 1);            p --;        }        *(pn2->expr) = '(';        strcat(pn2->expr, ")");    }    *(pn2->expr + strlen(pn2->expr) + 1) = 0x00;    *(pn2->expr + strlen(pn2->expr)) = op;    pn2->priority = PRIORITY(op);    pn2->merged = 1;        if(PRIORITY(op) > pn1->priority)    {        if(pn1->merged) strcat(pn2->expr, "(");        strcat(pn2->expr, pn1->expr);        if(pn1->merged) strcat(pn2->expr, ")");    }    else    {        strcat(pn2->expr, pn1->expr);    }    phdr->next = pn2;        free(pn1->expr);    free(pn1);}void build_link(PTItem phdr, char* _expr){    if(! phdr || ! _expr) exit(-1);    char* p = _expr, *q = p;    while(*p)    {        if(ISOPERATOR(*p))        {            merge_link(phdr, *p);            q = p + 1;            if(*q)            {                p ++;                q ++;            }        }        else if(ISSEPERATOR(*p))        {            PTItem pitem = (PTItem)malloc(sizeof(TItem));            memset(pitem, 0, sizeof(TItem));            pitem->expr = (char*)malloc(sizeof(char) * (p - q + 1));            strncpy(pitem->expr, q, p - q);            pitem->expr[p - q] = 0x00;            q = p + 1;            pitem->next = phdr->next;            phdr->next = pitem;            pitem->priority = 0;        }        p ++;    }    printf("expression is: %s\n", phdr->next->expr);}void free_link(PTItem phdr){    PTItem p = phdr->next;    while(p)    {        phdr->next = p->next;        if(p->expr) free(p->expr);        free(p);        p = phdr->next;    }}int main(void){    char expr[256] = { 0 };    printf("Please input expression:\neg: 12,3,+,6,4,-,*,3,/\n");        int i = 0;    for(i = 0; i < 255; i ++)    {        scanf("%c", &expr[i]);        if(NEWLINE == expr[i])        {            expr[i] = 0x00;            if(i && (RETURN == expr[i - 1]))                expr[i - 1] = 0x00;            break;        }    }        for(i = strlen(expr) - 1; i >= 0; i --)    {        if(ISOPERATOR(expr[i])) break;                expr[i] = 0x00;    }    if(*expr)    {        TItem hdr = { 0 };                build_link(&hdr, expr);        free_link(&hdr);    }    fflush(stdin);    getchar();    return 0;} 

读书人网 >C语言

热点推荐