ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1358:中缀表达式值(expr)

2021-11-21 14:32:37  阅读:256  来源: 互联网

标签:ch return 中缀 int expr ntop char 1358 表达式


【题目描述】

输入一个中缀表达式(由0-9组成的运算数、加+减-乘*除/四种运算符、左右小括号组成。注意“-”也可作为负数的标志,表达式以“@”作为结束符),判断表达式是否合法,如果不合法,请输出“NO”;否则请把表达式转换成后缀形式,再求出后缀表达式的值并输出。

注意:必须用栈操作,不能直接输出表达式的值。

【输入】

一行为一个以@结束的字符串。

【输出】

如果表达式不合法,请输出“NO”,要求大写。

如果表达式合法,请输出计算结果。

【输入样例】

1+2*8-9@

【输出样例】

8

#include<cstdio>
#include<iostream>
using namespace std;

const int N = 1000;
char a[N] = {0};
char c[N] = {0};
int n[N] = {0};
int ntop, ctop;

bool symbol(char ch)
{
    if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
        return true;
    }
    return false;
}

void calc(char ch)
{
    if (ch == '+') {
        n[--ntop] += n[ntop + 1];
    } else if (ch == '-') {
        n[--ntop] -= n[ntop + 1];
    } else if (ch == '*') {
        n[--ntop] *= n[ntop + 1];
    } else if (ch == '/') {
        n[--ntop] /= n[ntop + 1];
    }
}

bool first(char ch1, char ch2)
{
    if (ch1 == '-' || ch1 == '+') {//默认不运算
        if (ch2 == '-' || ch2 == '+') {
            return true;
        }
        return false;
    }
    if (ch1 == '*' || ch1 == '/') {//默认要运算
        return true;
    }
    return false;
}

int main()
{
    gets(a);
    int cm = 0, cn = 0;
    for (int i = 0; a[i] != '\0'; i++) {
        if (a[i] >= '0' && a[i] <= '9') {
            int x = 0;
            while (a[i] >= '0' && a[i] <= '9') {
                x = x * 10 + a[i] - '0';
                i++;
            }
            n[++ntop] = x;
        }
        if (a[i] == '(') {
            c[++ctop] = '(';
            cm++;
        }
        if (a[i] == ')') {
            cn++;
            while (c[ctop] != '(') {
                calc(c[ctop]);
                ctop--;
            }
            ctop--;
        }
        if (symbol(a[i])) {
            while (first(c[ctop], a[i])) {
                calc(c[ctop]);
                ctop--;
            }
            ctop++;
            c[ctop] = a[i];
        }
        if (symbol(a[i]) && symbol(a[i + 1])) {
            cout << "NO";
            return 0;
        }
    }
    while (ctop != 0) {
        calc(c[ctop]);
        ctop--;
    }
    if (cm != cn) {
        cout << "NO";
        return 0;
    }
    cout << n[ntop];
    return 0;
}

  

标签:ch,return,中缀,int,expr,ntop,char,1358,表达式
来源: https://www.cnblogs.com/gaojs/p/15584383.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有