c语言问题: 用堆栈作作一个计算器,给出表达式能得到结果

[复制链接]
查看11 | 回复0 | 2009-1-30 06:28:38 | 显示全部楼层 |阅读模式
为了简化问题,不妨假设所有数据都是int 型,运算符都是二元操作符(,),+,-,*,/函数原型int Calc(char *str);例如main(){ int value; value=Calc("8+5*4-6/2"); printf("\\n%d",value); getch();}

                                                                                                以前做的,-------------------#include<iostream.h>#include<stdlib.h>#include<conio.h>typedef struct{        int data[100];        int top;}A;int g(char ch){        char *s="0123456789+-*/";        while(*s!=\'+\'){                if(ch==*s)                return 1;//数字                s++;        }        while(*s!=\'*\'){                if(ch==*s)                return 2;//\'+\',\'-\'                s++;        }        while(*s!=\'\\0\'){                if(ch==*s)                return 3;//\'*\',\'/\'                s++;        }        return 0;}void G(A *p,A *q,char *s){        p->top=q->top=-1;        while(*s!=\'\\0\'){                if(g(*s)==1)                q->data[++q->top]=*s;                else if(*s==\'(\')        p->data[++p->top]=*s;               
else if(*s==\')\'){                                                while(p->data[p->top]!=\'(\')                 q->data[++q->top]=p->data[p->top--];                                                p->top--;                         }                                else if(*s==\'+\'||*s==\'-\'){                                                        while(g(p->data[p->top])==2||g(p->data[p->top])==3)                q->data[++q->top]=p->data[p->top--];                                                        p->data[++p->top]=*s;                                }                                         else if(*s==\'*\'||*s==\'/\'){                                                                while(g(p->data[p->top])==3)                q->data[++q->top]=p->data[p->top--];                                                                p->data[++p->top]=*s;                                                }                s++;        }        while(p->top!=-1)                q->data[++q->top]=p->data[p->top--];}void F(int *z,int x,int y,char c){        switch(c){                case \'+\':        *z=x+y;                break;                case \'-\':        *z=x-y;                break;                case \'*\':        *z=x*y;                break;                case \'/\':        *z=x/y;                break;        }}int f(A *q){        A *p=(A *)malloc(sizeof(A));        p->top=-1;        for(int i=0;i<=q->top;i++){                if(g(q->data)==1)        p->data[++p->top]=q->data-48;                else if(g(q->data)==2||g(q->data)==3)        {                                F(&p->data[p->top-1],p->data[p->top-1],p->data[p->top],q->data);                                p->top--;                }        }        return p->data[p->top];}void main(){        char s[]="1+2*(7-6+0+3)/4-1";//原算术表达式        cout<<"原算术表达式是:"<<endl<<s<<endl;        A *p=(A *)malloc(sizeof(A)),*q=(A *)malloc(sizeof(A));        G(p,q,s);        cout<<"其逆波兰表达式是:"<<endl;        for(int i=0;i<=q->top;i++)                cout<<(char)q->data;        cout<<endl<<s<<"="<<f(q)<<endl;        getch();}                                       
提问者对答案的评价:

                                                                                                //c++版的#include <iostream>using namespace std;typedef enum prio{add=0,sub,mul,divi,bra_f,bra_r,nus}prio; //+,-,*,/,(,),#typedef struct Stack{        //栈的数据节点        union{                int opnd;//运算数                prio optr; //运算符        };//union        struct Stack* next;}Stack,*Stackp;//Stacktypedef struct LStack{        //栈的总结点        Stackp base;        Stackp top;}LStack;//LStackchar priority[7][7]={\'>\',\'>\',\'<\',\'<\',\'<\',\'>\',\'>\',\'>\',\'>\',\'<\',\'<\',\'<\',\'>\',\'>\',\'>\',\'>\',\'>\',\'>\',\'<\',\'>\',\'>\',\'>\',\'>\',\'>\',\'>\',\'<\',\'>\',\'>\',\'<\',\'<\',\'<\',\'<\',\'<\',\'=\',\' \',\'>\',\'>\',\'>\',\'>\',\' \',\'>\',\'>\',\'<\',\'<\',\'<\',\'<\',\'<\',\' \',\'=\'};bool InitStack(LStack &S){        //构造一个空栈S        //成功返回true,否则返回false        S.base=(S.top=NULL);        return true;}//InitStackbool StackEmpty(LStack S){        //判断一个栈S是否为空        return S.top==NULL?true:false;}//StackEmptyStackp Pop(LStack &S){        //删除栈顶元素,并返回其地址        //若栈为空 返回NULL        Stackp p;        if(StackEmpty(S)) return NULL;        p=S.top;        S.top=S.top->next;        return p;}//Popvoid Push(LStack &S,Stackp &e){        //插入一个元素e 为新的栈顶        e->next=S.top;        S.top=e;}//Pushvoid DestroyStack(LStack &S){        //销毁一个栈S        Stackp p;        while(!StackEmpty(S)){        p=Pop(S);        delete p;        }//while}//DestroyStackvoid trans(char c,prio &pri){//运算符转换        switch(c){                case \'+\':pri=add;break;                case \'-\':pri=sub;break;                case \'*\':pri=mul;break;                case \'/\':pri=divi;break;                case \'(\':pri=bra_f;break;                case \')\':pri=bra_r;break;                case \'#\':pri=nus;break;                default:cout<<"输入有误"<<endl;exit(0);                };//switch}//transvoid doopertor(Stackp &n,Stackp &m,prio pri_in){//运算                        switch(pri_in){                                case add:                                        n->opnd=n->opnd+m->opnd;                                        break;                                case sub:                                        n->opnd=n->opnd-m->opnd;                                        break;                                case mul:                                        n->opnd=n->opnd*m->opnd;                                        break;                                case divi:                                        n->opnd=n->opnd/m->opnd;                                        break;                                default:                                         cout<<"致命错误!"<<endl;                                }//switch}//doopertorint main(){        LStack OPND;//运算数栈        LStack OPTR;//运算符栈        prio pri,pri_in;        InitStack(OPND);        InitStack(OPTR);        Stackp e=new Stack;        e->next=NULL;        e->optr=nus;        Push(OPTR,e);        int c,a,flag=0;        //        c=getchar();        while(c!=\'\\n\'){                if(c>=\'0\'&&c<=\'9\'){                        a=c-\'0\';                        if(flag==0){                                e=new Stack;                                e->next=NULL,e->opnd=a;                                Push(OPND,e);                                flag=1;                        }//if                        else{                                Stackp q;                                q=Pop(OPND);                                q->opnd=q->opnd*10+a;                                Push(OPND,q);                        }//else                }                else{                        flag=0;                        trans(c,pri);                        pri_in=OPTR.top->optr;                        Stackp q=new Stack;                        q->optr=pri;                        switch(priority[pri_in][pri]){                                case \'<\':Push(OPTR,q);break;                                case \'=\':                                        if(pri==bra_r){                                                delete q;                                                q=Pop(OPTR);                                                delete q;                                        }//if                                        delete q;                                        break;                                case \'>\':                                        while(priority[pri_in][pri]==\'>\'){                                                Stackp m,n;                                                m=Pop(OPND);                                                n=Pop(OPND);                                                doopertor(n,m,pri_in);                                                Push(OPND,n);                                                delete m;                                                n=Pop(OPTR);                                                delete n;                                                pri_in=OPTR.top->optr;                                        }//while                                        if(q->optr!=bra_r)                                                Push(OPTR,q);                                        else{                                                delete q;                                                q=Pop(OPTR);                                                delete q;                                        }                                        break;                                default:break;                        };//switch                                        }//else                c=getchar();        }//while        //cout<<OPND.top->next->opnd<<endl;        cout<<OPND.top->opnd<<endl;        DestroyStack(OPND);        return 0;}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行