数据结构C----表达式求值---栈的应用

1. 完整代码

/*
 * @Author: JRAdmin
 * @Date: 2021-11-04 20:09:16
 * @LastEditTime: 2021-11-08 09:02:07
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \VSCode\Data_Structure\03_stack\ExpressionEvaluationDemo1.cpp
 * Expression evaluation (表达式求值--栈)
 */

#include <stdio.h>
#include <math.h>
#include <string.h>

#define MaxSize 20

typedef struct{
    double data[MaxSize];
    int top;
}SqStack_N;

void InitStack_N(SqStack_N &S){
    S.top = -1;
}

bool Empty_N(SqStack_N S){
    if(S.top == -1){
        return true;
    }
    return false;
}

bool Push_N(SqStack_N &S, double e){
    if(S.top + 1 == MaxSize){
        return false;
    }
    S.data[++S.top] = e;
    return true;
}

bool Pop_N(SqStack_N &S, double &e){
    if(Empty_N(S)){
        return false;
    }
    e = S.data[S.top--];
    return true;
}

//

typedef struct{
    char data[MaxSize];
    int top;
}SqStack_S;

void InitStack_S(SqStack_S &S){
    S.top = -1;
}

bool Empty_S(SqStack_S S){
    if(S.top == -1){
        return true;
    }
    return false;
}

bool Push_S(SqStack_S &S, char e){
    if(S.top + 1 == MaxSize){
        return false;
    }
    S.data[++S.top] = e;
    return true;
}

bool Pop_S(SqStack_S &S, char &e){
    if(Empty_S(S)){
        return false;
    }
    e = S.data[S.top--];
    return true;
}

double ars(double a, double b, char c){
    if(c == '+'){
        return a+b;
    }
    if(c == '-'){
        return a-b;
    }
    if(c == '*'){
        return a*b;
    }
    if(c == '/'){
        return a/b;
    }
    return 0;
}


int ispriority(char ch){   // 栈内优先级
    switch (ch){
        case '#':
            return 0;
            break;
        case '(':
            return 1;
            break;
        case '*':
        case '/':
            return 5;
            break;
        case '+':
        case '-':
            return 3;
            break;
        case ')':
            return 6;
            break;
        default:
            break;
    }
    return -1;
}

int icpriority(char ch){   // 栈外优先级
    switch (ch){
        case '#':
            return 0;
            break;
        case '(':
            return 6;
            break;
        case '*':
        case '/':
            return 4;
            break;
        case '+':
        case '-':
            return 2;
            break;
        case ')':
            return 1;
            break;
        default:
            break;
    }
    return -1;
}

void ExpreesionEvaluation(double &ans){
    SqStack_N S_Num;
    SqStack_S S_Symbol;
    InitStack_N(S_Num);
    InitStack_S(S_Symbol);
    char str[MaxSize];
    printf("字符串中间不要加空格,并且以 # 结尾\n");
    scanf("%s",str);
    double Num[MaxSize];
    char Symbol[MaxSize];
    int a[10],k = 0, p = 0;
    for(int i = 0; i < strlen(str); i++){   // 将 字符 变成 整型
        if(str[i] != '+' && str[i] != '-' && str[i] != '*' && str[i] != '/' && str[i] !='(' && str[i] != ')' && str[i] != '#'){
            a[++k] = str[i];
        }else{
            if(k != 0){
                int num = 0,temp = k;
                while(k != 0){
                    num += (a[k] - 48)*(pow(10,(temp - k)));
                    k--;
                }  //k = 0;
                Num[p++] = num;  //   监测printf("%d\t",num); 
            }
            Symbol[p++] = str[i];  // 监测   printf("%c\t",str[i]);
            
        }
    }

    Push_S(S_Symbol,'#');
    for(int i= 0; i < p; i++){
        if(Symbol[i] != '+' && Symbol[i] != '-' && Symbol[i] != '*' && Symbol[i] != '/' && Symbol[i] !='(' && Symbol[i] != ')' && Symbol[i] != '#'){
            Push_N(S_Num,Num[i]);
        }else{
            if(icpriority(Symbol[i]) == '#'){
                break;
            }
            if(icpriority(Symbol[i]) > ispriority(S_Symbol.data[S_Symbol.top])){     // c 外 
                Push_S(S_Symbol,Symbol[i]);
            }else{
                while(icpriority(Symbol[i]) < ispriority(S_Symbol.data[S_Symbol.top])){
                    char q;
                    double e1, e2;
                    Pop_S(S_Symbol,q);
                    Pop_N(S_Num,e1);
                    Pop_N(S_Num,e2);
                    double ans = ars(e2,e1,q);
                    Push_N(S_Num,ans);
                }
                if(icpriority(Symbol[i]) == ispriority(S_Symbol.data[S_Symbol.top])){
                    char q;
                    Pop_S(S_Symbol,q);
                }else{
                    Push_S(S_Symbol,Symbol[i]);
                }
            }
        }
    }
    Pop_N(S_Num,ans);
}

int main(){
    double ans;
    char str[10];
    ExpreesionEvaluation(ans);
    printf("%.2f\n",ans);
    return 0;
}

2、运行截图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值