数据结构预算法分析计算后缀表达式(可计算小数)

/*计算后缀表达式(加强版),可运算‘+ - * /’可以多位数并且可以带小数进行运算,两个运算数据之间用空格隔开,如:1.1 2.2+  遇到#符号,运算结束 打印运算结果*/

//头文件
#ifndef _Three19a_H
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;
typedef PtrToNode Position;
Stack CreateStack();
double PopTop(Stack s);
void Push(Stack s,double c);
struct Node{
    double c;
    Position next;
};
#endif

/********************************************************************************************************/

#include
#include
#include
#include
#include "three19a.h"
//建栈
Stack CreateStack()
{
    Stack s;
    s=(Stack)malloc(sizeof(struct Node));
    if(s==NULL)
    {
        printf("error");
        return NULL;
    }
    s->next=NULL;
    return s;

}
//出栈并返回栈顶元素
double PopTop(Stack s)
{
    Position p;
    double ch ;
    if(s->next==NULL)
    {
        printf("error");
        return -1;
    }
    else
    {
        p=s->next;
        ch=p->c;
        s->next=s->next->next;
        free(p);

    }
    return ch;

}
//返回栈顶元素
double Top(Stack s)
{
    
    if(s->next==NULL)
    {
        printf("error");
        return -1;
    }
    else
        return s->next->c;

}
//入栈
void Push(Stack s,double c)
{
    Position p;
    p=(Position)malloc(sizeof(struct Node));
    if(p==NULL)
    {
        printf("error");
        return ;
    }
    else
    {
        p->c=c;
        p->next=s->next;
        s->next=p;
    }
}
main()
{
    
    int j=0;
    double op2;
    char ch;
    char a[100];
    Stack s=CreateStack();
    while((ch=getchar())!='#')
    {
        
    
        if(ch=='+'||ch=='-'||ch=='*'||ch=='/')//是符号就弹出数值进行运算,运算结果入栈。
        {
            switch(ch)
            {
                case '+':
                Push(s,PopTop(s)+PopTop(s));
                break;
                case '-':
                op2=PopTop(s);
                Push(s,PopTop(s)-op2);
                break;
                case '*':
                Push(s,PopTop(s)*PopTop(s));
                break;
                case '/':
                op2=PopTop(s);
                if(op2!=0)
                Push(s,PopTop(s)/op2);
                else
                    printf("error");
                break;
                

            }
        }
        else
        {

            if(isdigit(ch))//如果是数字字符,存到数组中
            {
                j=0;
                a[j]=ch;
                while(isdigit(ch=getchar())||ch=='.')//看接下来的输入是否还是数字字符,是的话继续存在数组中,如果不是结束循环。
                    a[++j]=ch;
                a[j+1]='\0';
                Push(s,atof(a));//atof(a)把字符串转换为浮点数,压入栈中。

         /*在上述while循环中,到取到字符不是数字字符时,结束循环,这个取到的字符有可能是空格,也有可能是运算符,

            如果是空格就不必管了;

            如果是运算符;要重新放回到输入流中,下次取字符时才能够取到。*/

               if(ch!=' ')

               ungetc(ch,stdin);
            }            
            
        }
            
    }
    printf("%f",PopTop(s));
                
}

你可能感兴趣的:(算法)