基于栈的计算中缀表达式求值(纯c语言篇)

 e826fd17efbb4cacaf710f1db1dc3c0a.png

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

//栈的操作
#define max 10
typedef struct zhan
{
    double V[max];
    int base;
    int top;
}zhan;

//初始化
zhan* init()
{
    zhan* p;
    p = (zhan*)malloc(sizeof(zhan));
    p->base = p->top = 0;
    for (int i = 0; i < max; i++)
        p->V[i] = 0;
    return p;
}
//压栈
void push(zhan* L,double a)
{
    if (is_full(L))
    {
        printf("full\n");
        return;
    }
    L->V[L->top] = a;
    L->top++;
}
//出栈
void pop(zhan* L)
{
    if (is_empty(L))
    {
        printf("empty\n");
        return;
    }
    L->top--;
    L->V[L->top] = 0;
}
//查看栈顶元素
double serach(zhan* L)
{
    if (is_empty(L))
    {
        printf("empty\n");
        return 0;
    }
    double a = L->V[L->top - 1];
    return a;
}
//判断是否为空
int is_empty(zhan* L)
{
    if (L->top == L->base)
        return 1;
    return 0;
}
//判断是否满
int is_full(zhan* L)
{
    if (L->top >= max)
        return 1;
    return 0;
}

//操作函数

void operate(zhan* open, zhan* fu)
{
    char h =(char) serach(fu);
    if (h == '*')
    {
        double m = serach(open);
        pop(open);
        double n = serach(open);
        pop(open);
        double k = n * m;
        push(open, k);
    }
    if (h =='/')
    {
        double m = serach(open);
        pop(open);
        double n = serach(open);
        pop(open);
        double k = n / m;
        push(open, k);
    }
    if (h == '+')
    {
        double m = serach(open);
        pop(open);
        double n = serach(open);
        pop(open);
        double k = n + m;
        push(open, k);
    }
    if (h == '-')
    {
        double m = serach(open);
        pop(open);
        double n = serach(open);
        pop(open);
        double k = n - m;
        push(open, k);
    }
    pop(fu);
}

//有字符串转数字及符号

void zhuan(char*k)
{
    //初始化操作数栈
    zhan* open = init();
    //初始化操作符栈
    zhan* fu = init();
    while(*k!='=')
    {
        //如果是数字
        if (*k <= '9' && *k >= '0')
            //暂时存储一下
        {
            char h = *k;
            double m = (double)h - (double)'0';
            push(open, m);
            k++;
            while (1)
            {
                if (*k <= '9' && *k >= '0')
                {
                    double n = serach(open);
                    pop(open);
                    h = *k;
                    m = n * 10 + (double)h - (double)'0';
                    push(open, m);
                    k++;
                }

                else
                {
                    break;
                }
            }
            if (*k == '.')
            {
                k++;
                int i = 1;
                while (1)
                {
                    if (*k <= '9' && *k >= '0')
                    {
                        m = serach(open);
                        pop(open);
                        char h = *k;
                        m = m + ((double)h - (double)'0') / pow(10, i);
                        i++;
                        push(open, m);
                        k++;
                    }
                    else
                    {
                        break;
                    }
                }
            }

        }
        if (*k == '+')
        {
            while(1)
            {
                char h = (char)serach(fu);
                if (h == '*'||h=='/')
                {
                    operate(open, fu);
                }
                else
                {
                    break;
                }
            }
            char h = *k;
            double l = (double)h;
            push(fu, h);
            k++;
        }
        if (*k == '-')
        {
            while (1)
            {
                char h = (char)serach(fu);
                if (h == '*' || h == '/')
                {
                    operate(open, fu);
                }
                else
                {
                    break;
                }
            }
            char h = *k;
            double l = (double)h;
            push(fu, h);
            k++;
        }
        if (*k == '*')
        {
            char l = *k;
            double m = (double)l;
            push(fu, l);
            k++;
        }
        if (*k == '/')
        {
            char l = *k;
            double m = (double)l;
            push(fu, l);
            k++;
        }
        if (*k == '(')
        {
            char l = *k;
            double m = (double)l;
            push(fu, l);
            k++;
        }
        if (*k == ')')
        {
            while (1)
            {
                char m = (char)serach(fu);
                if (m == '(')
                {
                    pop(fu);
                    break;
                }
                else 
                {
                    operate(open, fu);
                }
            }
            k++;
        }
    }
    while (!is_empty(fu))
    {
        operate(open, fu);
    }
    double m = serach(open);
    printf("%lf", m);
}

//测试函数
void test01()
{
    char shi[1024]; 
    scanf("%s", shi);
    zhuan(shi);
    
    
}
int main()
{
    test01();
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值