Cpp 使用链式栈实现 表达式计算

下载地址

http://note.youdao.com/yws/public/resource/0e69c6de95b576ea2a028b5fd970c2ce/E123404216F4435FAD4B3A8D76D508DD

#include <stdio.h>
#include "LinkStack.h"



int isNumber(char c)
{
    return ('0' <= c) && (c <= '9');
}

int isOperator(char c)
{
    return (c == '+') || (c == '-') || (c == '*') || (c == '/');
}

int isLeft(char c)
{
    return (c == '(');
}

int isRight(char c)
{
    return (c == ')');
}

int priority(char c)
{
    int ret = 0;

    if( (c == '+') || (c == '-') )
    {
        ret = 1;
    }

    if( (c == '*') || (c == '/') )
    {
        ret = 2;
    }

    return ret;
}

char* transform(const char* exp)
{
    printf("输入%s\n" , exp);
    int i = 0;
    int j = 0;
    char * result = (char*)malloc(sizeof(char) * 100 );

    LinkStack* stack = LinkStack_Create();
    while( exp[i] != '\0' )
    {
        if( isNumber(exp[i]) )
        {
            //output(exp[i]);
            result[j] = exp[i];
            j++;
        }
        else if( isOperator(exp[i]) )
        {
            if(LinkStack_Size(stack) > 0){
                while( priority(exp[i]) <= priority((char)(int)LinkStack_Top(stack)) )
                {
                    //output((char)(int)LinkStack_Pop(stack));
                    result[j] = (char)(int)LinkStack_Pop(stack);
                    j++;
                }
            }


            LinkStack_Push(stack, (void*)(int)exp[i]);
        }
        else if( isLeft(exp[i]) )
        {
            LinkStack_Push(stack, (void*)(int)exp[i]);
        }
        else if( isRight(exp[i]) )
        {
            //char c = '\0';
            while( !isLeft((char)(int)LinkStack_Top(stack)) )
            {
                //output((char)(int)LinkStack_Pop(stack));
                result[j] = (char)LinkStack_Pop(stack);
                j++;
            }

            LinkStack_Pop(stack);
        }
        else
        {
            printf("Invalid expression!");
            break;
        }

        i++;
    }
    while( (LinkStack_Size(stack) > 0) && (exp[i] == '\0') )
    {
        //output((char)(int)LinkStack_Pop(stack));
        result[j] = (char)LinkStack_Pop(stack);
        j++;
    }
    printf("转后缀%s\n" , result);
    LinkStack_Destroy(stack);
    return result;
}



int value(char c)
{
        return (c - '0');
}

int express(int left, int right, char op)
{
        int ret = 0;

        switch(op)
        {
        case '+':
                ret = left + right;
                break;
        case '-':
                ret = left - right;
                break;
        case '*':
                ret = left * right;
                break;
        case '/':
                ret = left / right;
                break;
        default:
                break;
        }

        return ret;
}

int compute(const char* exp)
{
        LinkStack* stack = LinkStack_Create();
        int ret = 0;
        int i = 0;

        while( exp[i] != '\0' )
        {
        if( isNumber(exp[i]) )
                {
                        LinkStack_Push(stack, (void*)value(exp[i]));
                }
        else if( isOperator(exp[i]) )
                {
                        int right = (int)LinkStack_Pop(stack);
                        int left = (int)LinkStack_Pop(stack);
                        int result = express(left, right, exp[i]);

                        LinkStack_Push(stack, (void*)result);
                }
                else
                {
                        printf("Invalid expression!");
                        break;
                }

                i++;
        }

        if( (LinkStack_Size(stack) == 1) && (exp[i] == '\0') )
        {
                ret = (int)LinkStack_Pop(stack);
        }
        else
        {
                printf("Invalid expression!");
        }

        LinkStack_Destroy(stack);

        return ret;
}

int main()
{
        printf("结果%d\n" , compute(transform("8+(3-1)*5")));
        system("pause");
        return 0;
}

http://note.youdao.com/share/?id=0e69c6de95b576ea2a028b5fd970c2ce&type=note#/

转载于:https://my.oschina.net/sfshine/blog/685705

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值