BUAA计算器(表达式计算-后缀表达式实现)

【问题描述】

从标准输入中读入一个整数算术运算表达式,如24 / ( 1 + 5%3 + 36 / 6 / 2 - 2) * ( 12 / 2 / 2 )= ,计算表达式结果,并输出。

要求:

1、表达式运算符只有+、-、*、/、%,表达式末尾的=字符表示表达式输入结束,表达式中可能会出现空格;
2、表达式中会出现圆括号,括号可能嵌套,不会出现错误的表达式;

3、出现除号/时,以整数相除进行运算,结果仍为整数,例如:5/3结果应为1。

4、要求采用逆波兰表达式来实现表达式计算。

【输入形式】

从键盘输入一个以=结尾的整数算术运算表达式。操作符和操作数之间可以有空格分隔。

【输出形式】

在屏幕上输出计算结果(为整数,即在计算过程中除法为整除)。

【样例输入】

24 / ( 1 + 5%3 + 36 / 6 / 2 - 2) * ( 12 / 2 / 2 ) =

【样例输出】

18
【样例说明】

按照运算符及括号优先级依次计算表达式的值。

方法一

#include <stdio.h>
#include <string.h>
#define MAX 202

struct opstack
{
   
    int data[101];
    char character[101];
    int top;
};

int i, j, n, result;
char c;
typedef struct opstack stack;
stack op, num;

void initstack(stack *s) {
    s->top = -1; }

void push_stack(stack *s, char c, int line)
{
   
    s->character[++s->top] = c;
    s->data[s->top] = line;
}

int pop_stack(stack *s, stack *num)
{
   
    int tamp = 0;
    switch (s->character[s->top])
    {
   
    case '+':
        tamp = num->data[num->top - 1] + num->data[num->top];
        break;
    case '-':
        tamp = num->data[num->top - 1] - num->data[num->top];
        break;
    case '*':
        tamp = num->data[num->top - 1] * num->data[num->top];
        break;
    case '/':
        tamp = num->data[num->top - 1] / num->data[num->top];
        break;
    case '%':
        tamp = num->data[num->top - 1] % num->data[num->top];
        break;
    }
    s->character[s->top] = '\0';
    s->data[s->top] = '\0';
    s->top--;
    num->top -= 2;
    return tamp;
}

int main(void)
{
   
    initstack(&op);
    initstack(&num);
    op.character[++op.top] = 32;
    op.data[op.top] = -1;
    while ((c = getchar()) != '=')
    {
   
        if (c >= '0' && c <= '9')
        {
   
            for (i = 0; c >= '0' && c <= '9'; c = getchar())
                n = c - '0' + n * 10;
            ungetc(c, stdin);
            push_stack(&num, 32, n);
            n = 0;
        }
        else if (c != ' ')
        {
   
            int pnum = 0, option = 0;
            switch (c)
            {
   
            case '+':
                option = 1;
                break;
            case '-':
                option = 1;
                break;
            case '*':
                option = 2;
                break;
            case '/':
                option = 2;
                break;
            case '%':
                option = 2;
                break;
            case '(':
                option = 5;
                break;
            case ')':
                option = 6;
                break;
            }
            if (option <= op.data[op.top] && op.data[op.top] != 5)
            {
   
                pnum = pop_stack(&op, &num);
                push_stack(&num, 32, pnum);
            }
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值