码迷,mamicode.com
首页 > 其他好文 > 详细

栈与队列应用:计算前缀表达式的值

时间:2020-03-14 13:11:15      阅读:58      评论:0      收藏:0      [点我收藏+]

标签:switch   ||   oid   形式   测量   不同   函数   表示法   pop   

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如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;
}

 

栈与队列应用:计算前缀表达式的值

标签:switch   ||   oid   形式   测量   不同   函数   表示法   pop   

原文地址:https://www.cnblogs.com/ZhengLijie/p/12491344.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!