hallo~~ 2020-04-13 09:19 采纳率: 0%
浏览 385

c语言数据结构与算法作业:简易计算器

利用表达式原转后缀、后缀求值算法编写计算器程序。
要求:允许用户输入表达式,然后计算并输出结果。
表达式中有加减乘除运算符、括号。
操作数可为浮点型
求大佬帮我看看哪里出问题了

#include<stdlib.h>
#include<string.h>


typedef struct snode
{
    char data;
    struct snode *next;
}Snode,*LinkStack;

typedef struct std
{ 
    float data;
    struct std *nexts;
}STD,*ST;


void InitStack(LinkStack *LS);
int Push(LinkStack *LS,char e);
int Pop(LinkStack *LS);

void InitStack1(ST *Ls);
void Pushs(ST *s,float e);
float Pops(ST *Ls);

void Transformation(char a[100],char suff[100]);
int prior(char a);
int isdigit(char e);
int GetTop(LinkStack s);
int Calculate(char b[100]);



void main()
{ 
    char a[100],suff[100];
    printf("请输入多项式(输入英文括号):");
    gets(a);
    Transformation(a,suff);
    printf("原表达式转后缀式为(以#结尾):");
    puts(suff);
    Calculate(suff);
}

void InitStack(LinkStack *LS)
{
    *LS=NULL;
}

void InitStack1(ST *Ls)
{
    *Ls=NULL;
}

int Push(LinkStack *LS,char e)
{
    LinkStack p=(LinkStack)malloc(sizeof(snode));
    p->data=e;
    p->next=*LS;
    *LS=p;
    return 1;
}

void Pushs(ST *s,float e)
{
    ST p=(ST)malloc(sizeof(STD));
    p->data=e;
    p->nexts=*s;
    *s=p;
}

int Pop(LinkStack *LS)
{   
    char e;
    LinkStack p=*LS;
    if(*LS==NULL) return 0;
    *LS=(*LS)->next;
    e=p->data;
    free(p);
    return e;
}

float Pops(ST *Ls)
{   
    float i;
    ST p=*Ls;
    if(*Ls==NULL)return 0;
    *Ls=(*Ls)->nexts;
    i=p->data;
    free(p);
    return i;
}

int prior(char a)
{
    if(a=='*'||a=='/')  return 4;
    else if(a=='+'||a=='-')   return 3;
    else if(a=='(')  return 2;
    else if(a=='#')  return 1;
    else return 0;
}

int GetTop(LinkStack s)
{   
    char e;
    if(s==NULL)  return 0;
    e=s->data;
    return e;
}

int isdigit(char e)
{
    if(e>='0'&&e<='9') return 1;
    if(e=='.') return 1;
    return 0;
}

void Transformation(char a[100],char suff[100])
{   int i=0,j=0,length=0;
    char ch;
    LinkStack s;
    InitStack(&s);
    Push(&s,'#');
    length=strlen(a);
    a[length]='#';
    a[length+1]='\0';
    while(a[i]!='\0')
    {
        if(isdigit(a[i])) suff[j++]=a[i];
        else
        {
            switch(a[i])
        {
            case'(':Push(&s,a[i]);break;
            case')':ch=Pop(&s); 
                while(ch!='(')
                {suff[j++]=ch;
                ch=Pop(&s);
                }
                break;
            default:
                ch=GetTop(s);
                while(prior(ch)>=prior(a[i]))
                {
                    suff[j++]=ch;
                    ch=Pop(&s);
                    ch=GetTop(s);
                }
                if(a[i]!='#')Push(&s,a[i]);
        }
            suff[j++]=32;
        }
        i++;
    }
        suff[j]='\0';
}

int Calculate(char b[100])
{   
    ST s;
    float v=0,a=0;
    int i=0;
    float j=0,x1=0,x2=0;
    InitStack1(&s);
    while(b[i]!='#')
    {
        switch(b[i])
        {
        case' ':break;
        case'+':x2=Pops(&s);
                x1=Pops(&s);
                Pushs(&s,x1+x2);
                break;

        case'-':x2=Pops(&s);
                x1=Pops(&s);
                Pushs(&s,x1-x2);
                break;

        case'*':x2=Pops(&s);
                x1=Pops(&s);
                Pushs(&s,x1*x2);
                break;

        case'/':x2=Pops(&s); 
                x1=Pops(&s);
                if(x2!=0)  Pushs(&s,x1-x2);
                else
                {
                    printf("错误,分母为0。\n");
                    return 0;}
                break;
        default:if(b[i]<='9'&&b[i]>='0')
                {
                    v=0;
                    v=b[i]-48;
                    i++;
                    while(b[i]<='9'&&b[i]>='0')
                    {
                        v=v*10+(b[i]-48);
                        i++;
                    }
                    if(b[i]=='.')   
                    {   
                        i++;
                        j=0.1;
                        while(b[i]<='9'&&b[i]>='0')
                        {
                            a=a+j*(b[i]-48);
                            j=j*j;
                            i++;
                        }
                    }
                }
                v=v+a;
                Pushs(&s,v);
                break;
        }
        i++;
    }
    printf("结果(保留两位小数)=%.2f\n",Pops(&s));
    return 1;
}
  • 写回答

1条回答 默认 最新

  • threenewbee 2020-04-13 09:32
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug