zoukankan      html  css  js  c++  java
  • 一本通1331后缀表达式的值

    【题目描述】

    从键盘读入一个后缀表达式(字符串),只含有0-9组成的运算数及加(+)、减(—)、乘(*)、除(/)四种运算符。每个运算数之间用一个空格隔开,不需要判断给你的表达式是否合法。以@作为结束标志。

    比如,16–9*(4+3)转换成后缀表达式为:16□9□4□3□+*–,在字符数组A中的形式为:

    栈中的变化情况:

    运行结果:-47

    提示:输入字符串长度小于250,参与运算的整数及结果之绝对值均在2^64范围内,如有除法保证能整除。

    【输入】

    一个后缀表达式。

    【输出】

    一个后缀表达式的值。

    【输入样例】

    16 9 4 3 +*-@

    【输出样例】

    -47

    代码:


    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<string>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    using namespace std;
    long long stack[257];
    char s[256];
    long long comp(char s[256])//函数
    {
    long long i=0,top=0,x,y;
    while(i<=strlen(s)-2)//除去‘0’和‘@’,所以减2
    {
    switch(s[i])
    {
    case'+':stack[--top]+=stack[top+1];break;//如果是“+”号,那么指针下移一个,然后当前指针指的数加上上一个数,以下同理
    case'-':stack[--top]-=stack[top+1];break;
    case'*':stack[--top]*=stack[top+1];break;
    case'/':stack[--top]/=stack[top+1];break;
    default:x=0;while(s[i]!=' ') x=x*10+s[i++]-'0';//如果不是运算符,那么当这是一个数时(没有空格),那就要乘以十,就是左移一位,可以这么理解:原来的数后面跟了一个数(其实是一个数),那么前面的数就要乘以十再加上后面的数,才能凑到正确的数值(自己算一算就行,想一想应该能明白)
    stack[++top]=x;break;//因为加了一个数,那么指针就要往上指一下,并等于这个数
    }
    i++;//找下一个
    }
    return stack[top];//返回最后的值
    }
    int main()
    {
    gets(s);
    cout<<comp(s);
    return 0;
    }

    不知道哪里做错了,我一定会回来改的!

    7.3:

    三个多月后我回来了,发现不能是长度减2,应该是读到'@'结束(例题代码坑死人)

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<string>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    using namespace std;
    long long stack[257];
    char s[256];
    long long comp(char s[256])//函数
    {
        long long i=0,top=0,x,y;
        while(s[i]!='@')
        {
            switch(s[i])
            {
                case'+':stack[--top]+=stack[top+1];break;//如果是“+”号,那么指针下移一个,然后当前指针指的数加上上一个数,以下同理
                case'-':stack[--top]-=stack[top+1];break;
                case'*':stack[--top]*=stack[top+1];break;
                case'/':stack[--top]/=stack[top+1];break;
                default:x=0;while(s[i]!=' ') x=x*10+s[i++]-'0';//如果不是运算符,那么当这是一个数时(没有空格),那就要乘以十,就是左移一位,可以这么理解:原来的数后面跟了一个数(其实是一个数),那么前面的数就要乘以十再加上后面的数,才能凑到正确的数值(自己算一算就行,想一想应该能明白)
                stack[++top]=x;break;//因为加了一个数,那么指针就要往上指一下,并等于这个数
            }
            i++;//找下一个
        }
        return stack[top];//返回最后的值
    } 
    int main()
    {
        gets(s);
        cout<<comp(s);
        return 0;
    }
  • 相关阅读:
    CSS——如何清除浮动
    CSS——display(Block none inline等)属性的用法
    css3——position定位详解
    [转载]mysql创建临时表,将查询结果插入已有表中
    [转载]基于LVS的AAA负载均衡架构实践
    Percona Toolkit 2.2.19 is now available
    [转载]使用awk进行数字计算,保留指定位小数
    [转载]github在线更改mysql表结构工具gh-ost
    [转载]binlog归档
    [转载]MySQL运行状态show status详解
  • 原文地址:https://www.cnblogs.com/57xmz/p/12609543.html
Copyright © 2011-2022 走看看