zoukankan      html  css  js  c++  java
  • 栈与队列应用:计算前缀表达式的值

    算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。
    
    输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、/以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
    输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR。
    
    输入格式:+ + 2 * 3 - 7 4 / 8 4
    输出格式:13.0
    
    
    
    
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<ctype.h>  //isdit函数
    #include<math.h>  //fabs函数 求绝对值
    
    #define MAXSIZE 100
    
    typedef double ElemType;
    typedef struct
    {
        ElemType *base;
        ElemType *top;
        int StackSize;
    }sqStack;
    
    void InitStack(sqStack *s)
    {
        s->base = (ElemType *)malloc(sizeof(ElemType) * MAXSIZE);
        if(!s->base)
        {
            exit(0);
        }
        s->top = s->base;
        s->StackSize = MAXSIZE;
    }
    
    void Push(sqStack *s, ElemType e)
    {
        if(s->top - s->base == s->StackSize)
        {
            exit(0);
        }
        *(s->top) = e;
        s->top++;
    }
    
    void Pop(sqStack *s, ElemType *e)
    {
        if(s->top == s->base)
        {
            return;
        }
        
        *e = *--(s->top);
    }
    
    int main(void)
    {
        sqStack sq;
        char sl[30];
        char c;
        double d,e;
        int i,len,k;
        int sum;
        char str1[10];  //缓冲区
        char str2[10]; 
        int count = 0;
        int tem;
        int flag = 0;
        
        InitStack(&sq); //初始化 
        
        gets(sl);
        for(i=0; sl[i]; i++); //测量长度 
        len = i;
        tem = len;
        i = 1;
        while(tem)
        {
            c = sl[len-i];
            while( isdigit(c) || c=='.')  //缓冲区 
            {
                str1[count++] = c;
                str1[count] = '\0';
                i++;
                c = sl[len-i];
                tem--;
                if(c == ' ' || c=='-' || c=='+')
                {
                    for(k=0; k<count; k++)  //逆序 
                    {
                        str2[k] = str1[count-k-1];
                    }
                    str2[count] = '\0';
                    d = atof(str2);           //将字符串转化为浮点型 
                    if(c == '-')             //出现+1
                    {
                        d = -d;
                        i++;
                        c = sl[len-i];
                    }
                    if(c == '+')             //出现-1
                    {
                        d = +d;
                        i++;
                        c = sl[len-i];
                    }
                    Push(&sq,d);
                    count = 0;
                    str2[0] = '\0';
                    break;
                }
            }
            
            switch(c)
            {
                case '+':
                    Pop(&sq,&e);
                    Pop(&sq,&d);
                    Push(&sq,d+e);
                    break;
                case '-':
                    Pop(&sq,&e);
                    Pop(&sq,&d);
                    Push(&sq,e-d);
                    break;
                case '*':
                    Pop(&sq,&e);
                    Pop(&sq,&d);
                    Push(&sq,d*e);
                    break;
                case '/':
                    Pop(&sq,&e);
                    Pop(&sq,&d);
                    if(d != 0)
                    {
                        Push(&sq,e/d);
                    }
                    else
                    {
                        flag = 1;
                    }
                    break;
            }
            
            i++;
            c = sl[len-i];
            tem--;
        }
        if(flag == 0)
        {
            Pop(&sq,&d);
            if(fabs(d-0.0)<0.0000001)
            {
                printf("0");
            }
            else
            printf("%.1f",d);
        }
        else
        {
            printf("ERROR"); 
        }
        return 0;
    }
  • 相关阅读:
    Java运算符号,对象赋值,别名
    斐波那契数列的应用
    递归问题------汉诺塔
    字符串变量小议
    编程题之合并两个有序的数组
    线程/进程的区别之小议(二)
    线程/进程的区别之小议(一)
    OSI 七层模型
    TCP/IP 四层模型
    c语言程序开发过程,编译的完整过程
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12491344.html
Copyright © 2011-2022 走看看