c语言计算器(栈实现)

只测试有限是数据,测试结果均正确



#include <stdio.h>
#include <ctype.h>

//最大的输入长度
#define MAXSIZE 100

//定义栈
typedef struct stack
{
    int stack[MAXSIZE];
    int index;
}Stack;


int isNoOp(int ch)
{
if (ch == ')' || ch == '(')
{
return 1;
}
else
{
return 0;
}
}


int isPriority(int ch1, int ch2)
{
    if (ch2 == '(') {
        return 0;
    }
    else if (ch2 == ')')
    {
        return 1;
    }
    else if (ch2 == '+' || ch2 == '-')
    {
        if (ch1 == '(') {
            return 0;
        }
        else
        {
            return 1;
        }
    }
    else
    {
        if (ch1 == '*' || ch1 == '/' || ch1 == ')') {
            return 1;
        }
        else
        {
            return 0;
        }
    }
}


int isEmpty(Stack stack)
{
    if (stack.index < 0) {
        return 1;
    }
    else
    {
        return 0;
    }
}


void exchangeStack(Stack *stack)
{
    int i;
    int temp;
    for (i = 0; i <= (stack->index) / 2; i ++) {
        temp = stack->stack[i];
        stack->stack[i] = stack->stack[stack->index - i];
        stack->stack[stack->index - i] = temp;
    }
}


void initStack(Stack *stack)
{
    int i;
    for (i = 0; i < MAXSIZE; i ++) {
        stack->stack[i] = 0;
    }
    stack->index = -1;
}


int push(Stack *stack)
{
    return stack->stack[(stack->index) --];
}


void pull(Stack *stack, int x)
{
    stack->stack[++ (stack->index)] = x;
}

Stack num,operate,num2,operate2;
int op1,op2,op3,first = 0,opx,opy,sum = 0,flag = 0;


int Calculate(char ch, int x, int y)
{
    switch (ch) {
        case '+':
            return x + y;
            break;
        case '-':
            return x - y;
            break;
        case '*':
            return x * y;
            break;
        case '/':
            return x / y;
            break;
    }
    return -1;
}


void handle(char ch)
{
    if (isEmpty(operate2) && flag == 1)
    {
        if (isEmpty(operate))
        {
            if (isEmpty(num2))
            {
                opx = push(&num);
                opy = push(&num);
                sum = Calculate(op1, opx, opy);
                pull(&num, sum);
            }
            else
            {
                opx = push(&num2);
                opy = push(&num);
                sum = Calculate(op1, opx, opy);
                pull(&num, sum);
            }
        }
        else
        {
            op2 = push(&operate);
            if (isPriority(op1, op2))
            {
                pull(&operate, op2);
                if (isEmpty(num2))
                {
                    opx = push(&num);
                    opy = push(&num);
                    sum = Calculate(op1, opx, opy);
                    pull(&num2, sum);
                }
                else
                {
               
                    opx = push(&num2);
                    opy = push(&num);
                    sum = Calculate(op1, opx, opy);
                    pull(&num2, sum);
                }
            }
            else
            {
                pull(&operate2, op1);
                pull(&operate2, op2);
                if (op2 != '(')
                {
                   sum = push(&num);
  pull(&num2, sum);
}
            }
        }
    }
    
    else
    {
        if (isEmpty(operate))
        {
            if (isEmpty(num2))
            {
                opx = push(&num);
                opy = push(&num);
                sum = Calculate(op1, opx, opy);
                pull(&num, sum);
            }
            else
            {
                opx = push(&num2);
                opy = push(&num);
                sum = Calculate(op1, opx, opy);
                pull(&num, sum);
            }
        }
        else
        {
            op2 = push(&operate);
            if (isPriority(op1, op2))
            {
                pull(&operate, op2);
                if (isEmpty(num2))
                {
                    opx = push(&num);
                    opy = push(&num);
                    sum = Calculate(op1, opx, opy);
                    pull(&num, sum);
                }
                else
                {
                    opx = push(&num2);
                    opy = push(&num);
                    sum = Calculate(op1, opx, opy);
                    pull(&num, sum);
                }
            }
            else
            {
                pull(&operate2, op1);
                pull(&operate2, op2);
                if (op2 != '(')
                {
                   sum = push(&num);
  pull(&num2, sum);
}
            }
        }
    }
}


int main(int argc, const char * argv[])
{
    initStack(&num);
    initStack(&operate);
    initStack(&num2);
    initStack(&operate2);
    
    char ch[100] = {},ch1;
    int i = -1;
    int size = 1;
    int temp;
    
    scanf("%s",ch);
    while ((ch1 = ch[++ i]) != '\0')
    {
        if ((ch1 == '(' || ch1 == ')' || ch1 == '+' || ch1 =='*' || ch1 == '/')
            || (ch1 == '-' && i > 0 && isdigit(ch[i - 1]))) {
            flag = 0;
            size = 1;
            
            pull(&operate, ch1);
        }
        else if (ch1 == '-')
        {
            size = -1;
        }
        else
        {
            if (flag == 0) {
                pull(&num, size * (ch1 - 48));
                flag = 1;
            }
            else
            {
                temp = push(&num) * 10 + size * (ch1 - 48);
                pull(&num, temp);
            }
        }
    }
    exchangeStack(&num);
    exchangeStack(&operate);
 
    
    flag = -1;
    
    while (1) {
        if (isEmpty(operate2) && isEmpty(num2)) {
            pull(&num2, push(&num));
        }
        if (!isEmpty(operate2))
        {
            flag = 1;
            op1 = push(&operate2);
        }
        else if (!isEmpty(operate))
        {
            flag = 0;
            op1 = push(&operate);
        }
        else
        {
            flag = -1;
            break;
        }
        
        switch (op1) 
{
            case '(':
                pull(&operate2,op1);
                op2 = push(&operate);
            pull(&operate2,op2);
            if (!isNoOp(op2))
            {
            pull(&num2,push(&num));
}
                break;
            case ')':
push(&operate2);
                break;
            case '+':
                handle('+');
                break;
            case '-':
                handle('-');
                break;
            case '*':
                handle('*');
                break;
            case '/':
                handle('/');
                break;
        }
    }
    
    
    if (!isEmpty(num2)) {
        printf("%d\n",push(&num2));
    }
    else if (!isEmpty(num))
    {
        printf("%d\n",push(&num));
    }
    
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值