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

Posted zhenglijie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈与队列应用:计算前缀表达式的值相关的知识,希望对你有一定的参考价值。

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如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] = ;
            i++;
            c = sl[len-i];
            tem--;
            if(c ==   || c==- || c==+)
            {
                for(k=0; k<count; k++)  //逆序 
                {
                    str2[k] = str1[count-k-1];
                }
                str2[count] = ;
                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] = ;
                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;
}

 

以上是关于栈与队列应用:计算前缀表达式的值的主要内容,如果未能解决你的问题,请参考以下文章

栈与队列应用:逆波兰计算器(逆波兰表达式;后缀表达式)把运算符放到运算量后边 && 中缀表达式转化为后缀表达式

日照——栈与队列

Leetcode栈与队列150. 逆波兰表达式求值(后缀表达式求值!!看作对对碰游戏!!)

栈与队列:循环队列算法+可执行代码

浅析栈与队列在java中的基本应用

数据结构系列栈与队列