首页 > 其他 > 详细

进阶实验3-3.1 求前缀表达式的值 (25分)--堆栈

时间:2020-03-07 22:56:25      阅读:170      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 解题思路:(考虑小数,负数,以及多位整数)

从右向左扫描,遇到数字压栈,遇到运算符则弹出2个数,运算后再压栈,如此反复,直到处理完最后一个字符压栈后,栈顶所存即为求。

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <math.h>
#define ERROR -1
#define ElemType double
typedef enum { false,true
             } bool;
typedef struct {
    ElemType *Data;
    int Top;
    int MaxSize;
}*Stack;
Stack CreateStack(int size) {
    Stack S=(Stack)malloc(sizeof(Stack));
    S->Data=(ElemType *)malloc(sizeof(ElemType)*size);
    S->MaxSize=size;
    S->Top=-1;
    return S;
}
bool IsEmpty(Stack S) {
    if(S->Top==-1)
        return true;
    return false;
}
bool IsFull(Stack S) {
    if(S->Top==S->MaxSize-1)
        return true;
    return false;
}
bool Push(Stack S,ElemType X) {
    if(IsFull(S))
        return false;
    S->Data[++S->Top]=X;
    return true;
}
ElemType Pop(Stack S) {
    if(IsEmpty(S))
        return ERROR;
    return S->Data[S->Top--];
}
ElemType GetTop(Stack S) {
    return S->Data[S->Top];
}
bool IsNum(char c) {
    if(c>=0&&c<=9||c==.)
        return true;
    return false;
}
bool IsZF(char c) {
    if(c==-||c==+)
        return true;
    return false;
}
bool IsOp(char c) {
    if(c==-||c==+||c==/||c==*)
        return true;
    return false;
}
int main() {
    char c[31];
    gets(c);
    int len=strlen(c);
    int i,cnt=0,flag=0;
    Stack S=CreateStack(31);
    double sum=0.0;
    for(i=len-1; i>=0; i--) {
        if(IsNum(c[i])) {
            if(c[i]!=.) {
                sum+=(c[i]-0)*pow(10,cnt);
                cnt++;
            } else {
                sum/=pow(10,cnt);
                cnt=0;
            }
            if(c[i-1]== ) {
                Push(S,sum);
                cnt=0;
                sum=0.0;
            }
            if(IsZF(c[i-1])) {
                if(c[i-1]==-)
                    sum=-1*sum;
                Push(S,sum);
                sum=0.0;
                i--;
            }

        } else if(IsOp(c[i])) {
            double x=Pop(S);
            double y=Pop(S);
            if(c[i]==-) {
                sum=x-y;
            } else if(c[i]==+) {
                sum=x+y;
            } else if(c[i]==*) {
                sum=x*y;
            } else if(c[i]==/) {
                if(y==0) {
                    flag=1;
                    break;
                }
                sum=x/y;
            }
            Push(S,sum);
            sum=0;
        }
    }
    if(!flag)
        printf("%.1lf",Pop(S));
    else
        printf("ERROR");
    return 0;
}

 

进阶实验3-3.1 求前缀表达式的值 (25分)--堆栈

原文:https://www.cnblogs.com/snzhong/p/12437291.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!