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 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件
  • ¥15 有赏,i卡绘世画不出
  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员