编写程序,将表达式a+b*c-d/e转换成前缀表达式,输出。

编写程序,将表达式a+b*c-d/e转换成前缀表达式,输出。

1 个回答

DanaElano

提问:编写程序,将表达式a+b*c-d/e转换成前缀表达式,输出。

网友回答:

程序的话,你要告知你要用的语言的,以下是C++的参考(常见的数据结构)

#include <iostream> #include<stdlib.h> using namespace std; #define STACK_INIT_SIZE 100 #define STACKINCREASE 10 typedef struct {    char *base;    char *top;    int stacksize; } SqStack; int InitStack(SqStack &S) {    S.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));    if(!S.base)        {            cout<<"分配空间失败!";            exit(-1);        }    S.top=S.base;    S.stacksize=STACK_INIT_SIZE;    return 0; } int Push(SqStack &S,char e) {    if((S.top-S.base)>=STACK_INIT_SIZE)        {            S.base=(char *)realloc(S.base,(STACK_INIT_SIZE+STACKINCREASE)*sizeof(char));            if(!S.base)                {                    cout<<"分配空间失败!";                    exit(-1);                }            S.top=S.base+STACK_INIT_SIZE;            S.stacksize=STACK_INIT_SIZE+STACKINCREASE;        }    *(S.top)=e;//结构体    S.top++;    return 0; } int Pop(SqStack &S,char &e) {    if(S.base==S.top)        {            cout<<"栈为空!";            exit(0);        }    S.top--;    e=*(S.top);    return 0; } int GetTop(SqStack &S,char &e) {    if(S.base==S.top)        {            cout<<"栈为空!";            return 0;        }    else        {            e=*(S.top-1);            return 1;        } } int EmptyStack(SqStack &S) {    if(S.base==S.top) return 1;//stack is empty!    else return 0;//stack is not empty! } int Precede(char a,char b)//a为符号栈栈顶元素,b为待插入的元素 {    int i;//i=1入栈,i=0弹出操作符以及操作数进行计算    if((a=='+'||a=='-')&&(b=='*'||b=='/')) i=1;    if((a=='+'||a=='-')&&(b=='+'||b=='-')) i=0;    if((a=='*'||a=='/')&&(b=='*'||b=='/')) i=0;    if((a=='*'||a=='/')&&(b=='+'||b=='-')) i=0;    if(a=='('||a==')') i=1;    return i; } int Nifix_To_Prefix (const char *p) {    char a,c,d,e;    int i;    SqStack S,S1,S2;//S为操作符栈,S1为存储倒置后元素的栈,S2存储的是逆序的前缀表达式,最后依次弹出以实现最终的前缀表达式    InitStack(S);    InitStack(S1);    InitStack(S2);    //由于要从右到左依次读取表达式中的各个元素,所以这里利用一个栈S1将它们倒置    d='#';    Push(S1,d);    while(*p!='#')        {            d=*p;            Push(S1,d);            p++;            if(*p=='#') break;        }    Pop(S1,c);    cout<<"转换后的前缀表达式为:"<<endl;    while(c!='#')        {            if(c>='a'&&c<='z')  Push(S2,c);//表达式只支持小写            if(c==')') Push(S,c); //输入为右括号            if(c=='(')//输入为左括号                {                    if(!EmptyStack(S)) GetTop(S,e);                    while(e!=')')                        {                            Pop(S,a);                            Push(S2,a);                            if(!EmptyStack(S)) GetTop(S,e);//直到遇到左括号                            if(e==')') Pop(S,e);                        }                }            if(c=='+'||c=='-'||c=='*'||c=='/')                {                    if(EmptyStack(S))  Push(S,c);                    else                        {                            GetTop(S,e);                            i=Precede(e,c);                            if(i==1) Push(S,c);                            if(i==0)                                {                                    while(!i)                                        {                                            Pop(S,a);                                            Push(S2,a);                                            if(!EmptyStack(S))                                                {                                                    GetTop(S,e);                                                    i=Precede(e,c);                                                }                                            else break;                                        }                                    Push(S,c);                                }                        }                }            Pop(S1,c);        }    if(!EmptyStack(S))        {            while(!EmptyStack(S))                {                    Pop(S,a);                    Push(S2,a);                }        }    while(!EmptyStack(S2))        {            Pop(S2,a);            cout<<a<<" ";        }    cout<<endl;    return 0; } int main() {    Nifix_To_Prefix("a+b*c-d/e#");    cout <<endl;  return 0; }

结果为

  • 1 关注
  • 0 收藏, 浏览
  • 提出于

相似问题